不使用#define捕获__LINE__和__FILE__

时间:2016-04-25 21:39:09

标签: c++ c++11

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

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

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

期望的用例:

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

其中__FILE____LINE__被捕获,但反映了调用logError的文件名和行号。

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:6)

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

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

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