2013-03-20 63 views
2
#define Map(From, To, val)   \ 
     Map__##From__##To(val) 


Map(TYPEA, TYPEB, 22); 

在上面的代码中,我很奇怪,为什么Map(TYPEA, TYPEB, 22);是越来越扩大到Map__From__TYPEB(22);而不是Map__TYPEA__TYPEB(22);宏串联,函数名代

我用gcc-E扩展。

回答

4

因为From__Map,因此令牌,预处理器不看它..解决方法是:

#define Map(From, To, val) \ 
     Map__##From##__##To(val) 
+0

它工作正常,但我还没有理解的原因,请你指点我的一些文献,可以解释我从## ##和##之间的差异? – Kamath 2013-03-20 11:40:12

+0

其关于理解@LOK的基本原理,它的简单 - “From”是一个可以代替的标记。其中的From_from不是可替换的标记。可替代的令牌位于括号内。 – 2013-03-20 11:43:10

0
"#define ZERO 0" != "#define ZERO 0_" 

同样,在你的代码段,From != From_,因此不会被替换。 工作解决方案已由@Aniket提供。