C ++连接__FILE__和__LINE__宏?

时间:2013-10-13 08:25:04

标签: c++

我希望我的异常消息包含有关异常位置的信息。

所以我希望有一些类似的东西。

#define LOCATION __FILE__ " : " __LINE__

throw std::exception(std::string("ABCD. ") + LOCATION);

这个定义显然是不正确的。怎么做到这一点?

1 个答案:

答案 0 :(得分:56)

您需要将该宏扩展为两个级别:

#define S1(x) #x
#define S2(x) S1(x)
#define LOCATION __FILE__ " : " S2(__LINE__)

为什么?

简短回答: 在将其传递给__LINE__之前,您需要在两个级别展开#x

答案很长: 首先,在类似函数的宏中使用运算符#,它必须后跟一个宏参数,但__LINE__不是参数,所以编译器抱怨它是一个迷路运算符。

其次,__LINE__本身是一个宏并包含当前行号,在将其与#一起使用之前应将其扩展为数字,否则,您将获得字符串"__LINE__"而不是一个数字。

S2(__LINE__)__LINE__扩展为行号,然后我们将行号传递给#x