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扩展。
#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扩展。
因为From__
不Map
,因此令牌,预处理器不看它..解决方法是:
#define Map(From, To, val) \
Map__##From##__##To(val)
"#define ZERO 0" != "#define ZERO 0_"
同样,在你的代码段,From != From_
,因此不会被替换。 工作解决方案已由@Aniket提供。
它工作正常,但我还没有理解的原因,请你指点我的一些文献,可以解释我从## ##和##之间的差异? – Kamath 2013-03-20 11:40:12
其关于理解@LOK的基本原理,它的简单 - “From”是一个可以代替的标记。其中的From_from不是可替换的标记。可替代的令牌位于括号内。 – 2013-03-20 11:43:10