我定义了以下预处理器指令:
#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")