在不使用 #define 的情况下捕获 __LINE__ 和 __FILE__
Posted
技术标签:
【中文标题】在不使用 #define 的情况下捕获 __LINE__ 和 __FILE__【英文标题】:Capture __LINE__ and __FILE__ without #define 【发布时间】:2016-04-25 21:39:08 【问题描述】:尝试为以下 C 样式代码确定“现代”实现:
#define logError(...) log(__FILE__, __LINE__, __VA_ARGS__)
是否可以使用不依赖 #define
的可变参数模板或类似的东西来捕获它?
所需用例:
logError( "Oh no! An error occurred!" );
__FILE__
和 __LINE__
在后台被捕获,但反映了调用 logError
的文件名和行号。
【问题讨论】:
我认为不可能。宏的存在是有原因的,您可以在必要时使用它。 您有点要求使用这种日志记录创建软断点。 【参考方案1】:宏确实是您唯一的选择,至少在std::source_location
使其成为标准并满足您的愿望之前。
【讨论】:
std::source_location
现在显然在 GCC 中得到支持 godbolt.org/z/EsEY8T【参考方案2】:
实际上,当您想要处理行号和文件名时,预处理器是唯一的选择。
对于编译器,不能使用行号和文件名作为函数调用的参数(或将它们存储在变量中)。
在我的公司,我们在日志记录方面遇到了完全相同的问题。我们最终得到了一个外部脚本扫描源文件,然后构建适当的函数来调用。
【讨论】:
以上是关于在不使用 #define 的情况下捕获 __LINE__ 和 __FILE__的主要内容,如果未能解决你的问题,请参考以下文章
如何在不更改链接结构的情况下使用 \ 转义字符 (、)、[、]、*、_、:[]()
有没有办法在不使用 __init__ 的情况下在实例初始化时自动运行方法?
如何在不记录/写入 __db.00x 文件的情况下使用 Berkeley Db 事务?