C++标记粘贴运算符未在预处理器定义中连接__LINE_



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

#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");

如果它有任何用处,我的叮当版本详细信息:

❯ /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

我看到了使用和工作这种语法的示例(::Hazel::InstrumentationTimer timer##__LINE__(fixedName.Data)(。为什么令牌粘贴操作符在我的场景中没有像我预期的那样工作?

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

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

或者,使用字符串运算符将变量命名为计时器名称:

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

中的结果

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

相关内容

  • 没有找到相关文章

最新更新