如何获取函数被调用处的行号?是否存在类似__LINE__的宏?
问题分析
你当前的代码中,_DEBUG宏是在func1、func2函数内部调用的,预处理器宏__LINE__会捕获宏展开位置的行号(也就是函数内的行15、20),但你需要的是调用func1/func2时的行号(main函数里的25、26等)。
解决方案
不存在直接能获取函数调用处行号的预定义宏,但可以通过调整宏的设计实现需求:把func1、func2改成宏,让__LINE__在调用位置展开。
修改后的代码如下:
#include <iostream> using namespace std; void _debug(const string& text, int line) { cout << text << " " << line << endl; } // 将func1、func2定义为宏,在调用处展开时传入当前行号 #define func1() _debug("func1", __LINE__) #define func2() _debug("func2", __LINE__) int main() { func1(); // line 15(行号随实际代码位置自动调整) func2(); // line 16 func1(); // line 17 func2(); // line 18 }
运行后输出符合你的期望:
func1 15 func2 16 func1 17 func2 18
原理说明
__LINE__是预处理器在编译阶段处理的宏,它的值等于宏被展开时所在代码行的行号。通过把函数调用替换为宏,__LINE__会在main函数的调用位置展开,自然就能捕获到调用处的行号。
内容的提问来源于stack exchange,提问作者KcFnMi
相关产品推荐
相关产品推荐

