41

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

所以我想要一些类似的东西。

#define LOCATION __FILE__ " : " __LINE__

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

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

4

1 回答 1

70

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

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

原因如下:

在将__LINE__其传递给#x.

首先,#类函数宏中使用运算符,它必须后跟一个宏参数__LINE__不是参数,因此编译器抱怨它是一个流浪运算符。

另一方面,__LINE__它本身是一个宏并且包含当前行号,在使用它之前应该将它扩展为数字#,否则你将得到字符串"__LINE__"而不是数字。

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

于 2013-10-13T08:29:12.367 回答