不使用#define捕获__LINE__和__FILE__

dav*_*ler 10 c++ c++11

试图确定以下C风格代码的"现代"实现:

#define logError(...) log(__FILE__, __LINE__, __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

有可能使用可变参数模板或不依赖于类似的类似物来捕获它#define吗?

期望的用例:

logError( "Oh no! An error occurred!" );
Run Code Online (Sandbox Code Playgroud)

在哪里__FILE__,并__LINE__在引擎盖下捕获,但反映了logError从哪里调用的文件名和行号.

Que*_*tin 17

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


Gün*_*ena 6

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

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

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