【问题标题】:Including line number and filename in a string variable在字符串变量中包含行号和文件名
【发布时间】:2013-10-16 10:41:05
【问题描述】:

有没有一种简单的方法来构建包含_FILE__LINE_ 值的字符串?

我可以这样做:

std::stringstream ss;
ss << "Error in "<<_FILE_<<":"<<_LINE_<<" - too many bees!";
log(ss.str());

但与理想相比,这是一个 PITA:

log("Error in "+_FILE_+":"+_LINE_+" - too many bees!");

在 C++/STL/boost 中是否有一种巧妙的方法可以做到这一点?注意我仅限于较旧的编译器,没有 C++11!

【问题讨论】:

  • 顺便说一句,应该是__FILE____LINE__
  • 我看到带有单下划线和双下划线的问题,还有_line - 是所有版本都存在还是只是人们在打字时很懒惰?
  • @AlexFarber 相同的基本问题,但没有完整的答案(提供了工作代码示例)如果有人为任一问题提供了一个,那将是理想的。
  • @John 您需要自定义日志消息的哪一部分?我怀疑您是否想在每次想要记录某些内容时继续输入 __FILE____LINE__

标签: c++ visual-studio-2005


【解决方案1】:

正如 Alex 所评论的:双重宏扩展以使 __LINE__ 成为一个字符串并让编译器为您连接字符串:

#define S(x) #x
#define S_(x) S(x)
#define S__LINE__ S_(__LINE__)

log("Error in "__FILE__":"S__LINE__" - too many bees!");

按照 greatwolf 的建议减少打字:

#define logfl(s) log("Error in "__FILE__":"S__LINE__" - "s)

logfl("too many bees!");

【讨论】:

  • 我还发现#define log 到一些返回 ostream& 的函数非常有用,然后你可以在那里记录所有类型的对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2016-07-17
相关资源
最近更新 更多