C++连接__FILE__和__LINE__宏?

NFR*_*RCR 34 c++

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

所以我想有一些类似的东西.

#define LOCATION __FILE__ " : " __LINE__

throw std::exception(std::string("ABCD. ") + LOCATION);
Run Code Online (Sandbox Code Playgroud)

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

mas*_*oud 58

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

#define S1(x) #x
#define S2(x) S1(x)
#define LOCATION __FILE__ " : " S2(__LINE__)
Run Code Online (Sandbox Code Playgroud)

为什么?

简短回答:__LINE__在传递之前,您需要扩展两个级别#x.

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

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

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

  • Boost的[`BOOST_PP_STRINGIZE(__LINE __)`](http://www.boost.org/doc/libs/1_49_0/libs/preprocessor/doc/ref/stringize.html)这样做,万一你不想创建你自己的宏S1和S2. (4认同)
  • 如果我想将__PRETTY_FUNCTION__添加为第三个怎么办?提前致谢! (2认同)