宏定义中#、##、#@和参数加括号

复制代码
#include <stdio.h>

#define A(x, y)((x) * (y))
#define B(x, y)(x * y)

void main() {
    
    //非表达式参数
    printf("%d\n", A(11, 3));       //33    (11)*3
    printf("%d\n", B(11, 3));       //33    11*3

    //表达式参数
    printf("%d\n", A(6 + 5, 3));    //33    (6+5)*3
    printf("%d\n", B(6 + 5, 3));    //21    6+5*3

    //宏内的括号可以保证算术优先级,因为参数可能是表达式
}
复制代码

 

#的作用是将其后的宏参数字符串化操作,就是在它引用的宏变量的左右各加上一个双引号
如#define f(a)#ab,传入5,展开后为"5"b
复制代码
#include <stdio.h>
#define func(x, format) printf(#x" = %" #format "\n", x) void main() { int g = 200; const char* c = "Hello"; //printf("c"" = ""&s""\n", c); func(c, s); //printf("g"" = ""&d""\n", g); func(g, d); //因为C语言中,连续2个双引号会被编译器忽略 //printf("c"" = ""&s""\n", c); //变为 ////printf("c = &s\n", c); }
复制代码

 

##可以理解为两个#x,因为#x会自动在两侧添加双引号,所以##会添加两遍,也就等于没加,固##只是单纯的拼接

复制代码
#include <stdio.h>

#define f(n, format, i)(printf(#n#i" = %"#format"\n", n##i))

void main() {
    
    int x1 = 1;
    int x2 = 10;
    int x3 = 100;
    int x4 = 1000;
    f(x, d, 1);
    f(x, d, 2);
    f(x, d, 3);
    f(x, d, 4);

    /*
    结果:
    x1 = 1
    x2 = 10
    x3 = 100
    x4 = 1000

    */
}
复制代码

 

posted @   tetrachloroethylene  阅读(920)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示