-
27-09-2019 - |
题
在为调试目的,我可以得到线号码 C/C++编译器?(标准方法或具体的方式对某些编)
e.克
if(!Logical)
printf("Not logical value at line number %d \n",LineNumber);
// How to get LineNumber without writing it by my hand?(dynamic compilation)
解决方案
您应该使用预处理器宏 __LINE__
和 __FILE__
. 。它们是预定义的宏,是 C/C++ 标准的一部分。在预处理期间,它们分别被替换为包含表示当前行号的整数的常量字符串和当前文件名。
其他预处理器变量:
__func__
:函数名称(这是 C99, ,并非所有 C++ 编译器都支持)__DATE__
:格式为“Mmm dd yyyy”的字符串__TIME__
:格式为“hh:mm:ss”的字符串
您的代码将是:
if(!Logical)
printf("Not logical value at line number %d in file %s\n", __LINE__, __FILE__);
其他提示
的C ++的一部分标准存在一些预先定义的宏,你可以使用。作为C部分16.8 ++标准定义除其他事项外,__LINE__
宏。
<强>
__LINE__
:强>电流源线的行号(十进制 常数)。结果 的__FILE__
:强>源文件的推定名称(字符串 文字)。结果 的__DATE__
:强>源文件的翻译的日期(字符串 文字......)点击 的__TIME__
:强>源文件的翻译的时间(一个字符串 文字......)点击 的__STDC__
:强> Whether__STDC__
是预定义的,点击 的__cplusplus
:强>名称__cplusplus
被定义为值199711L时 编译一个C ++翻译单元
所以,你的代码是:
if(!Logical)
printf("Not logical value at line number %d \n",__LINE__);
您可以使用一个宏用相同的行为的 printf()的, 不同之处在于它还包括调试信息如 函数名,类别和行数:
#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堆栈跟踪状信息。下面是一个例子主要:
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.cpp中:11)exampleMethod(前)...,点击 exampleMethod(main.cpp中:7)printf()的语法:字符串= foobar的,INT = 42,点击 主(main.cpp中:13)的成功!
使用__LINE__
(这是双下划线LINE双下划线),预处理器将与在其上遇到了它的行号替换它。
结帐__FILE__
和__LINE__
宏
尝试__FILE__
和__LINE__
。结果
您可能还会发现__DATE__
和__TIME__
有用的。结果
虽然,除非你有调试对客户方的程序,因此需要记录这些信息,你应该使用正常的调试。
因为我也面临着这个问题现在和我无法添加一个回答一个不同但同样有效的问题 在这里,, 我会提供实例的问题的解决方案:得到的唯一的线路数量的功能已经调在C++使用的模板。
背景:C++一个可以使用非型整数值作为模板的论点。这是不同于典型使用情况的数据类型作为模板的论点。这样的想法是使用这种整数值的一个函数。
#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;
}
输出:
该功能已被所谓的在线数:0
该功能已被所谓的在线数:16
一个事情要在这里提到的是,在C++11标准可以得到缺省值的模板功能使用的模板。在预C++11默认值非型的论点似乎只适用于类模板的论点。因此,在C++11,就没有必要重复的功能定义上面。C++11它还有效的有const char*模板的论点,但它不可能使用它们与文字喜欢 __FILE__
或 __func__
如前所 在这里,.
因此,在结束如果你使用C++或C++11这可能是一个非常有趣的选择比使用宏得到调线。