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

时间:2016-06-04 06:24:28

标签: c++11 macros

问题C++ concatenating __FILE__ and __LINE__ macros?的已接受答案适用于文件 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数组。我该如何工作?有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

正如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 

答案 1 :(得分:0)

__func__ is a variable (not a macro unlike __FILE__ or __LINE__)

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