c ++宏连接在gcc下不起作用

时间:2011-09-27 08:23:10

标签: c++ c macros

#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,不要删除它。

2 个答案:

答案 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;                                                           
}