C 宏连接、函数名生成

C 宏连接、函数名生成,c,macros,concatenation,c-preprocessor,C,Macros,Concatenation,C Preprocessor,在上面的代码中,我想知道为什么Map(TYPEA,TYPEB,22)正在从类型B(22)扩展到映射和非地图类型A和类型B(22) 我使用gcc-E进行扩展。因为来自的不是Map中的标记,因此预处理器不会查找它。。修正是: #define Map(From, To, val) \ Map__##From__##To(val) Map(TYPEA, TYPEB, 22); 同样,在代码段中,From!=来自,因此不会被替换。 @Aniket已经提供了有效的解决

在上面的代码中,我想知道为什么
Map(TYPEA,TYPEB,22)正在从类型B(22)扩展到
映射和非
地图类型A和类型B(22)


我使用gcc-E进行扩展。

因为来自
不是
Map
中的标记,因此预处理器不会查找它。。修正是:

#define Map(From, To, val)          \
        Map__##From__##To(val)


Map(TYPEA, TYPEB, 22);
同样,在代码段中,
From!=来自
,因此不会被替换。
@Aniket已经提供了有效的解决方案。

它工作得很好,但我还不明白原因,你能给我指一些文献,可以解释##From##和######From之间的区别吗?这是关于理解@LOK的基本原理,它的简单--
From
是一个可以替代的标记。。其中,as
From_
不是可替换的标记。可替换标记在括号中。
#define Map(From, To, val) \
        Map__##From##__##To(val)
"#define ZERO 0" != "#define ZERO 0_"