【问题标题】:C++ concatenating __FILE__ and __LINE__ macros?C++ 连接 __FILE__ 和 __LINE__ 宏?
【发布时间】:2013-10-21 00:19:13
【问题描述】:

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

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

#define LOCATION __FILE__ " : " __LINE__

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

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

【问题讨论】:

标签: c++


【解决方案1】:

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

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

原因如下:

您需要将__LINE__ 扩展为两级,然后将其传递给#x

首先,在function-like宏中使用操作符#,后面必须跟一个宏parameter但是__LINE__不是参数,所以编译器抱怨它是一个杂散的运算符。

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

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

【讨论】:

  • 如果我想添加 PRETTY_FUNCTION 作为第三个呢?提前致谢!
  • Boost 的 BOOST_PP_STRINGIZE(__LINE__) 会这样做,以防您不想创建自己的宏 S1 和 S2。
  • @sree: #define LOCATION std::string(PRETTY_FUNCTION) + " :: " + std::string(FILE) + " :" + std::string(S2(LINE))
  • @adiog 虽然对 OP 要求提供异常字符串,即在函数中使用,但您的建议在此处出现错误:char foo[] = LOCATION; 在文件范围和函数中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2010-10-10
相关资源
最近更新 更多