2011-09-27 60 views
1
#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” 没有给出一个有效的预处理标记。C++宏concatation下GCC

我该如何解决

PS:宏扩展应该是LOG(LL_TRACE) - > __LOG(LL_TRACE) - > LOG_LL_TRACE()

PS:?假设LL_TRACE必须有一个0值,不要删除。

+0

我不认为我能理解你为什么会想要做这样的事情...的 –

+0

可能重复[使用##和__LINE__创建C宏(使用宏定位连接)](http://stackoverflow.com/questions/1597007/creating-c-macro-with-and-line-token-concatenation-with-positioning-宏) – littleadv

+0

宏扩展应该是LOG(LL_TRACE) - > __LOG(LL_TRACE) - > LOG_LL_TRA CE()。 __LOG是现实世界中复杂的宏,并且被批量LOG宏调用。 –

回答

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;               
} 
+0

它不起作用,它应该是LOG(LL_TRACE) - > __LOG(LL_TRACE) - > LOG_LL_TRACE(),而不是LOG((LL_TRACE) ) - > __LOG(0) –

+0

同意,但这是一个不同的问题。我的建议修复了您指出的错误。我用你需要的行为编辑我的文章。 – long404

+0

是的,它编译...但LL_TRACE是一个常量,稍后会用到。例如日志级别过滤器。 –

4

两件事情让这个代码在G不能++编译: 首先,你引用的错误是因为你想拥有这样的:

#define LOG(level) __LOG(level) 

通知没有##。这些哈希标记意味着连接,但你并没有连接任何东西。只是转发一个参数。

第二个错误是,你必须除去

#define LL_TRACE 0 

这条线意味着你最终调用LOG(0),其扩展为未限定LOG_0。

+0

宏扩展应该是LOG(LL_TRACE) - > __LOG(LL_TRACE) - > LOG_LL_TRACE()。 –

+0

或者如何转发宏参数而不扩展? –

+1

只需使用参数,就是宏扩展如果你使用我的LOG定义,那么这正是会发生的事情,只要删除'#define LL_TRACE 0'宏,我不知道你想用它完成什么,但它会中断这个序列: 'LOG (LL_TRACE) - > LOG(0) - > __LOG(0) - > LOG_0()' – Adam