尝试确定以下C风格代码的“现代”实现:
#define logError(...) log(__FILE__, __LINE__, __VA_ARGS__)
是否可以使用变参模板或类似的东西来捕获它,而不依赖于 #define
?
所需用例:
logError( "Oh no! An error occurred!" );
__FILE__
和__LINE__
在幕后被捕获,但反映了从哪里调用logError
的文件名和行号。
尝试确定以下C风格代码的“现代”实现:
#define logError(...) log(__FILE__, __LINE__, __VA_ARGS__)
是否可以使用变参模板或类似的东西来捕获它,而不依赖于 #define
?
所需用例:
logError( "Oh no! An error occurred!" );
__FILE__
和__LINE__
在幕后被捕获,但反映了从哪里调用logError
的文件名和行号。
宏确实是您唯一的选择,至少在std::source_location
成为标准并满足您的期望之前。
std::source_location
https://godbolt.org/z/EsEY8T - Ayxan Haqverdili实际上,预处理器是在需要使用行号和文件名时的唯一选择。
对于编译器来说,不可能将行号和文件名用作函数调用的参数(或将它们存储在变量中)。
在我的公司,我们在记录日志时遇到了完全相同的问题。最终我们采用了一个外部脚本扫描源文件,然后构建适当的函数进行调用。