2016-04-25 70 views
6

试图确定以下C风格代码中的“现代”的实施:捕捉__LINE__和__FILE__没有的#define

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

是可以使用这个可变参数模板或类似的东西,不依赖于捕捉a #define

期望的使用情况:

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

__FILE__,并且__LINE__在引擎盖下拍摄的,但反映的地方logError从所谓的文件名和行号。

+2

我不认为这是可能的。宏存在的原因是,如果有必要,你可以使用它。 –

+0

你有点要求用这种记录创建软断点。 – tadman

回答

5

事实上,预处理器是您想要处理行号和文件名的唯一选择。

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

在我的公司,我们遇到了与测井完全相同的问题。我们结束了一个外部脚本扫描源文件,然后构建适当的函数来调用。

11

宏确实是您的唯一选择,至少直到std::source_location使其成为标准并实现您的愿望。

+3

'std :: source_location'看起来不错! * twiddles拇指* – DaveyLaser

+0

这是groovy。我不知道他们是否使用光线追踪... – user4581301

+0

很酷,不知道那... –