【问题标题】:C++ Token Pasting Operator not concatenating __LINE__ in pre-processor definition [duplicate]C ++令牌粘贴运算符未在预处理器定义中连接__LINE__ [重复]
【发布时间】:2020-11-14 05:29:57
【问题描述】:

我已经定义了以下预处理指令:

#define TIMER(name) ::my_app::Timer timer##__LINE__(name)

使用如下:

TIMER("first");
TIMER("second");

我收到一条错误消息,指出第二个用法重新定义了 timer__LINE__

::my_app::Timer timer__LINE__("first");
::my_app::Timer timer__LINE__("second");

我真正想要的是一个带有源代码行号的计时器定义,例如:

::my_app::Timer timer1("first");
::my_app::Timer timer2("second");

如果有什么用,我的clang版本详细信息:

❯ /Library/Developer/CommandLineTools/usr/bin/clang --version
Apple clang version 11.0.3 (clang-1103.0.32.29)
Target: x86_64-apple-darwin19.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

我看到了this syntax is used and works (::Hazel::InstrumentationTimer timer##__LINE__(fixedName.Data)) 的示例。为什么令牌粘贴操作符在我的场景中没有像我预期的那样工作?

【问题讨论】:

  • 那里真的有用吗?
  • 我认为是这样 - 有相当数量的贡献者,我怀疑使用它的人要多得多(它来自 YouTube 系列)。但原来是MSVC,所以也许编译器实现的差异导致它在那里工作?
  • 感谢链接问题 - 完美解决。

标签: c++ token-pasting-operator


【解决方案1】:

你需要在__LINE__的评估之后推迟连接:

#define CONCAT(a,b) a b
#define PASTE(a,b) a##b
#define TIMER(name) ::my_app::Timer CONCAT(PASTE,(timer,__LINE__)) (name)

或者,使用 stringify-operator 将变量命名为计时器名称:

#define TIMER(name) ::my_app::Timer timer##name (#name)

TIMER(first)
TIMER(second)

结果

::my_app::Timer timerfirst ("first")
::my_app::Timer timersecond ("second")

【讨论】:

  • hmm 这是一种相当令人困惑的延迟连接方式,它通常像在骗局中介绍的那样完成。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多