不使用 #define 宏定义,如何获取 __LINE__ 和 __FILE__?

11

尝试确定以下C风格代码的“现代”实现:

#define logError(...) log(__FILE__, __LINE__, __VA_ARGS__)

是否可以使用变参模板或类似的东西来捕获它,而不依赖于 #define

所需用例:

logError( "Oh no! An error occurred!" );

__FILE____LINE__在幕后被捕获,但反映了从哪里调用logError的文件名和行号。


2
我认为这是不可能的。宏存在是有原因的,如果必要的话,你可以使用它。 - Bryan Chen
你有点像是在请求使用这种日志记录方式来创建软件断点。 - tadman
2个回答

22

宏确实是您唯一的选择,至少在std::source_location成为标准并满足您的期望之前。


据称,GCC现在支持std::source_location https://godbolt.org/z/EsEY8T - Ayxan Haqverdili

6

实际上,预处理器是在需要使用行号和文件名时的唯一选择。

对于编译器来说,不可能将行号和文件名用作函数调用的参数(或将它们存储在变量中)。

在我的公司,我们在记录日志时遇到了完全相同的问题。最终我们采用了一个外部脚本扫描源文件,然后构建适当的函数进行调用。


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