首页
学习
活动
专区
工具
TVP
发布

C/C++行号
EN

Stack Overflow用户
提问于 2010-05-17 22:25:56
回答 9查看 120.8K关注 0票数 120

出于调试目的,我可以在C/C++编译器中获取行号吗?(某些编译器的标准方式或特定方式)

e.g

代码语言:javascript
复制
if(!Logical)
    printf("Not logical value at line number %d \n",LineNumber);
    // How to get LineNumber without writing it by my hand?(dynamic compilation)
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-05-17 22:27:32

您应该使用预处理器宏__LINE____FILE__。它们是预定义的宏,是C/C++标准的一部分。在预处理过程中,它们将分别替换为包含表示当前行号的整数的常量字符串和当前文件名。

其他预处理器变量:

  • __func__:函数名(这是it)
  • __DATE__的一部分,并不是所有的C99编译器都支持it)
  • __DATE__:"Mmm yyyy"
  • __TIME__“形式的字符串:"hh:mm:ss"

形式的字符串

您的代码将是:

代码语言:javascript
复制
if(!Logical)
  printf("Not logical value at line number %d in file %s\n", __LINE__, __FILE__);
票数 198
EN

Stack Overflow用户

发布于 2010-05-17 22:27:29

作为C++标准的一部分,您可以使用一些预定义的宏。C++标准的第16.8节特别定义了__LINE__宏。

__LINE__**当前源代码行的行号(十进制常量)。

__FILE__**:源文件的假定名称(字符串文字)。

__DATE__**源文件的翻译日期(字符串...)

__TIME__**:源文件的翻译时间(字符串...)

__STDC__**是否预定义了__STDC__

__cplusplus**:在编译C ++翻译单元时,名称__cplusplus被定义为值199711L

所以你的代码应该是:

代码语言:javascript
复制
if(!Logical)
  printf("Not logical value at line number %d \n",__LINE__);
票数 65
EN

Stack Overflow用户

发布于 2014-11-08 05:15:58

您可以使用与printf()具有相同行为的宏,只是它还包含调试信息,如函数名、类和行号:

代码语言:javascript
复制
#include <cstdio>  //needed for printf
#define print(a, args...) printf("%s(%s:%d) " a,  __func__,__FILE__, __LINE__, ##args)
#define println(a, args...) print(a "\n", ##args)

这些宏的行为应该与printf()相同,同时包含类似java stacktrace的信息。下面是一个main示例:

代码语言:javascript
复制
void exampleMethod() {
    println("printf() syntax: string = %s, int = %d", "foobar", 42);
}

int main(int argc, char** argv) {
    print("Before exampleMethod()...\n");
    exampleMethod();
    println("Success!");
}

这将导致以下输出:

main(main.cpp:11)在exampleMethod()之前...

exampleMethod(main.cpp:7) printf()语法: string = foobar,int = 42

main(main.cpp:13)成功!

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2849832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档