#include <iostream>
void LOG_TRACE() { std::cout << "reach here"; }
#define LOG_LL_TRACE LOG_TRACE
#define LL_TRACE 0
#define __LOG(level) LOG_##level()
#define LOG(level) __LOG(##level)
int main()
{
LOG(LL_TRACE);
return 0;
}
代码在Visual Studio下工作,但报告:test.cpp:13:1:错误:粘贴“(”和“LL_TRACE”不提供有效的预处理令牌。
我该如何解决?
ps:宏扩展应该是LOG(LL_TRACE) - &gt; __LOG(LL_TRACE) - &gt; LOG_LL_TRACE()。
ps:假设LL_TRACE必须为0,不要删除它。
答案 0 :(得分:4)
有两件事使这段代码无法在g ++上编译: 首先,你引用的错误是因为你想要这个:
#define LOG(level) __LOG(level)
请注意没有##
。那些hashmarks意味着连接,但你不是连接任何东西。只是转发一个论点。
第二个错误是您必须删除
#define LL_TRACE 0
这一行意味着你最终调用LOG(0),它扩展为未定义的LOG_0。
答案 1 :(得分:0)
不应该是:
#define LOG(level) __LOG(level)
有效:
#include <iostream>
void LOG_TRACE() { std::cout << "reach here"; }
#define LOG_LL_TRACE LOG_TRACE
#define __LOG( level ) LOG_##level()
#define LOG(level) __LOG(level)
int main()
{
LOG( LL_TRACE );
return 0;
}