如何让__FILE __,__ func__和__LINE__宏在单行中工作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让__FILE __,__ func__和__LINE__宏在单行中工作?相关的知识,希望对你有一定的参考价值。

C++ concatenating __FILE__ and __LINE__ macros?问题的接受答案适用于FILE和LINE,但我也想添加func宏。

#define S1(x) #x
#define S2(x) S1(x)
#define S3(x) x

#define LOCATION __FILE__ " : " S3(__func__) " : " S2(__LINE__)

这给出了错误

log.cpp|15 col 15 error| note: in definition of macro ‘S3’

也尝试过,

#define LOCATION __FILE__ " : " __func__ " : " S2(__LINE__)

给出错误

log.cpp|30 col 9 error| note: in expansion of macro ‘LOCATION’

我知道LINE是一个整数,因此需要#x,但func是一个char数组。我该如何工作?有帮助吗?

答案

正如cpplearner正确提到的那样__func__不是一个宏,它是一个特殊的函数 - 局部预定义变量。我取得了理想的结果

#define S1(x) #x
#define S2(x) S1(x)
#define LOCATION string(__func__) + " : " S2(__LINE__) + " : "

我通过将字符串发送到包装器日志功能来使用它

void log(string s) {
     cout << s <<endl;
}

void abc(){
    log(LOCATION + string("some message "));
}

输出:

abc : 23 : some message 
另一答案
__func__ is a variable (not a macro unlike __FILE__ or __LINE__)

这个相关的问题Treating __func__ as a string literal instead of a predefined identifier有很好的解释。

以上是关于如何让__FILE __,__ func__和__LINE__宏在单行中工作?的主要内容,如果未能解决你的问题,请参考以下文章

C语言预定义宏 __func____FUNCTION____LINE____FILE____DATE____TIME__

C标准中一些预定义的宏,如__FILE__,__func__等

C/C++中的__FILE____LINE__#line__func__关键字(预定义宏)

如何在 8051 中使用 __func__

vs2017.unresolved external symbol __imp__fprintf&__imp____iob_func

如何解决 LNK2019 未解决的外部 __imp____iob_func