为什么要在C++中使用__LINE__宏

Sco*_*t J 2 c++

我试图弄清楚人们如何__LINE__在工作中使用宏.你们是如何使用它的?

Jon*_*ler 16

您可以使用__LINE__,同时__FILE__报告源代码中出现问题的位置.

例如,考虑assert()宏 - 这个来自C99标准的措辞,但C++是相似的,除了它没有提到__func__:

当它被执行时,如果表达式(它应具有标量类型)为假(即,比较等于0),则断言宏写入有关失败的特定调用的信息(包括参数的文本,名称源文件,源行号和封闭函数的名称 - 后者分别是实现定义格式的标准错误流上的预处理宏__FILE____LINE__标识符 的值__func__.

#define assert(x) (void)(((x)==0)?_Assert(#x,__FILE__,__LINE__,__func__):0)
Run Code Online (Sandbox Code Playgroud)


Ste*_*sop 7

一个更简单的例子,这是我在所有其他形式的调试失败时偶尔使用的宏:

#define GOT_HERE std::cout << "At " __FILE__ ":" << __LINE__ << std::endl
Run Code Online (Sandbox Code Playgroud)

然后,当你的代码神秘地崩溃并用它取下设备时,你至少可以将这个宏自由地放入源中,希望它能让你缩小崩溃发生的位置(以及重复之后).在实践中,您可能不会写入std :: cout,而是使用平台上可用的最低级别,最可靠的字符输出.


Hea*_*utt 5

我为malloc写了一个包装器:

#if DEBUG

#define malloc(s) debugging_malloc(s, __FILE__, __LINE__)
#define free(p) debugging_free(p)

// Also, calloc(), strdup(), realloc() should be wrapped.
#endif // DEBUG

在包装器中,根据发生的文件和行号来跟踪分配.程序退出时,实用程序功能输出任何不同块的列表.

如果你正在使用gcc,它也会给你__FUNCTION__,这真的很棒.符合C99标准的编译器也__func__同样方便.