热门IT资讯网

C宏定义中的‘#’和‘##’

发表于:2024-11-26 作者:热门IT资讯网编辑
编辑最后更新 2024年11月26日,/*#是把宏参数变为一个字符串,##是把两个宏参数连接在一起。*/#include #define f(a,b) a##b#define g(a) #a#define h(a) g(a)int ma
/*#是把宏参数变为一个字符串,##是把两个宏参数连接在一起。*/#include #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)

0