宏定义中#、##、#@和参数加括号
#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 */ }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix