尝试确定以下C样式代码的“现代”实现:

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

是否可以使用可变参数模板或不依赖#define的类似内容捕获此信息?

所需的用例:
logError( "Oh no! An error occurred!" );

其中__FILE____LINE__在后台捕获,但反射(reflect)了调用logError的文件名和行号。

最佳答案

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

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

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

07-26 06:47