我希望我的异常消息包含有关异常位置的信息。
所以我希望有一些类似的东西。
#define LOCATION __FILE__ " : " __LINE__
throw std::exception(std::string("ABCD. ") + LOCATION);
这个定义显然是不正确的。怎么做到这一点?
答案 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
。