C / C ++行号

为了debugging目的,我可以在C / C ++编译器中获得行号吗? (某些编译器的标准方式或具体方式)

例如

if(!Logical) printf("Not logical value at line number %d \n",LineNumber); // How to get LineNumber without writing it by my hand?(dynamic compilation) 

您应该使用预处理器macros__LINE____FILE__ 。 它们是预定义的macros,是C / C ++标准的一部分。 在预处理过程中,它们分别由一个常量stringreplace,该string保存一个表示当前行号的整数和当前文件名。

其他预处理器variables:

  • __func__ :函数名(这是C99的一部分,并不是所有的C ++编译器都支持它)
  • __DATE__ :表单string“Mmm dd yyyy”
  • __TIME__ :forms为“hh:mm:ss”的string

你的代码将是:

 if(!Logical) printf("Not logical value at line number %d in file %s\n", __LINE__, __FILE__); 

作为C ++标准的一部分,存在一些可以使用的预定义的macros。 C ++标准的第16.8节定义了__LINE__macros。

__LINE__当前源行的行号(十进制常量)。
__FILE__源文件的推测名称(string文字)。
__DATE__源文件的翻译date(string文字…)
__TIME__源文件的翻译时间(string文字…)
__STDC__是否预定义了__STDC__
__cplusplus在编译C ++翻译单元时,名称__cplusplus被定义为值199711L

所以你的代码是:

 if(!Logical) printf("Not logical value at line number %d \n",__LINE__); 

使用__LINE__ (这是双下划线LINE双下划线),预处理器将用它所遇到的行号replace它。

您可以使用与printf()具有相同行为的macros,除了它还包含诸如函数名称,类和行号之类的debugging信息:

 #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) 

这些macros的行为应与printf()相同,同时包括java stacktrace-like信息。 这是一个主例子:

 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)before exampleMethod()…
exampleMethod(main.cpp:7)printf()语法:string = foobar,int = 42
main(main.cpp:13)成功!

签出__FILE____LINE__macros

试试__FILE____LINE__
您也可能会发现__DATE____TIME__有用。
虽然除非你必须在客户端debugging一个程序,因此需要logging这些信息,你应该使用正常的debugging。

由于我现在也面临这个问题,我不能添加一个不同的答案,但也有效的问题在这里 ,我会提供一个示例解决scheme的问题:只获取行号的函数已被调用C ++使用模板。

背景:在C ++中,可以使用非整型值作为模板参数。 这与数据types作为模板参数的典型用法不同。 所以这个想法是使用这样的整数值进行函数调用。

 #include <iostream> class Test{ public: template<unsigned int L> int test(){ std::cout << "the function has been called at line number: " << L << std::endl; return 0; } int test(){ return this->test<0>(); } }; int main(int argc, char **argv){ Test t; t.test(); t.test<__LINE__>(); return 0; } 

输出:

该行的function被称为行号:0

该函数在行号16处被调用

这里要提到的一点是,在C ++ 11标准中,可以使用模板为函数提供默认的模板值。 在C ++ 11之前,非types参数的默认值似乎只适用于类模板参数。 因此,在C ++ 11中,不需要像上面那样重复的函数定义。 在C ++ 11中,它也可以有const char *模板参数,但是不能像这里提到的那样使用像__FILE____func__这样的文字。

所以最后如果你使用C ++或C ++ 11,这可能是一个非常有趣的select,比使用macros来获取调用线。