如何在现有的C/C++代码中捕获行号?

3

我正在尝试对现有程序进行分析,并需要记录行号,而不需要太多修改程序。我一直在使用__LINE__并希望像这样做:

file.h:

void Function( int iLine = __LINE___ );   // original function had no arguments, but now overloaded to default __LINE__

file.cpp:

void Function( int iLine ) {    // original function had no arguments, but now changed to int iLine
    // do something here
    // log iLine number to a file for analysis
}

main.cpp调用:

Function();    // call existing function

然而,我现在知道这样做行不通,因为iLine总是file.h定义的行号。
我尝试过使用StackWalker,但也遇到了困难,而且似乎有些过头了。
有什么建议可以在尽可能减少文件更改的情况下解决这个问题吗?

在提出没有特定C组件的C++问题时,请勿标记C。堆栈标签也没有任何理由。 - Eric Postpischil
2个回答

3

选项1:使用函数宏代替函数。宏将在“调用”位置扩展,从而给出正确的行数。宏本身可以很简单,只需将参数传递到适当的函数中。

选项2:使用即将推出的C++20中的std::source_location代替。


1
你可以查看 ASSERT() 宏的定义。
如果我没记错的话,它大概是这样的:
#define ASSERT(x) _assert( (x), __FILE__, __LINE__ );
void _assert( bool expression, const char* pfile, int line );

因此,ASSERT()宏用作_assert()函数的包装器,因此在调用站点展开,并且目标函数是否内联无关紧要。

这种使用_assert的方式在我的电脑上似乎不起作用。然而,如果未定义宏NDEBUG,则可以使用以下代码: #include <assert.h> #define ASSERT(x) assert( (x), FILE, LINE ); 有关更多详细信息,请参见https://en.cppreference.com/w/cpp/error/assert。 - user6547518

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接