一、宏的本质(唯一核心)
宏是 #define 定义的预处理纯文本替换。
关键特性(记死这4点):
-
无类型、不占内存、不运行计算
-
预处理阶段直接无脑粘贴替换
-
#define 后第一个标识符就是宏名,后面全是替换内容
-
宏只改代码文本,不参与程序运行
二、宏的两种分类
1. 无参宏(常量/标记)
格式:#define 宏名 内容
用途:定义常量、空宏标记(用于条件编译)
#define N 100 // 常量替换 #define DEBUG // 空宏,仅做标记
2. 带参宏(代码模板)
格式:#define 宏名(参数) 表达式
用途:简化简单运算,无函数调用开销
#define ADD(a,b) ((a)+(b))
三、宏 vs 变量(最简区分)
-
宏:改代码文本,预处理生效,无内存无类型
-
变量:存运行数据,编译运行生效,占内存有类型
四、带参宏必避的3个致命坑(高频报错)
1. 优先级坑(最常见)
参数、整体必须双层加括号,否则运算优先级错乱
❌ 错:#define MUL(a,b) a*b
✅ 对:#define MUL(a,b) ((a)*(b))
2. 参数重复执行坑
参数含i++、函数调用时,宏会重复展开执行,产生逻辑BUG
👉 这种场景坚决不用宏,改用函数
3. 无语法校验坑
宏只替换不检查语法,错误只会在编译阶段暴露,极难排查
五、最终使用准则(精华总结)
-
固定常量、编译标记:用无参宏
-
简单四则运算:用带参宏,严格双层括号
-
复杂逻辑、自增参数、函数传参:一律不用宏
-
宏名统一全大写,区分变量