在C++中连接__FILE__和__LINE__宏

Concatenating __FILE__ and __LINE__ macros in C++

本文关键字:LINE FILE 连接 C++      更新时间:2023-10-16

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

所以我想有这样的东西:

#define LOCATION __FILE__ " : " __LINE__
throw std::exception(std::string("ABCD. ") + LOCATION);

这种定义显然是不正确的。我怎样才能做到这一点?

您需要在两个级别中扩展该宏:

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

原因如下:

您需要在两个级别中扩展__LINE__,然后再将其传递给#x

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

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

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