/* #是把宏参数变为一个字符串,##是把两个宏参数链接在一块儿。 */ #include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { f(1, 2);//宏展开: 12; g(3); //宏展开: "3" /* 展开宏函数的规则: 在展开当前宏函数时,若是形参有#或##则不进行宏参数的展开, 不然先展开宏参数,再展开当前宏。 */ printf("%s\n", h(f(1, 2)));//12 printf("%s\n", g(f(1, 2)));//f(1,2) ,不进行宏参数的展开 system("pause"); return 0; }
综合以上:
第一行h(f(1,2)),因为h(a)非#或者##因此先展开其参数f(1,2),即12,因此变成h(12),而后再宏替换为g(12),再次替换为12。
第二行g(f(1,2)),宏g(a)带有#,因此里面的f(1,2)不展开,因此变成f(1,2)ide