C语言宏
在 C 语言中,宏(Macro)是一种预处理指令,用于在编译前对源代码进行文本替换。
宏由预处理指令 #define 定义,分为两种类型:
- 对象式宏(Object-like Macro):无参数的简单文本替换。
- 函数式宏(Function-like Macro):带参数的类似函数调用的宏。
对象式宏
#define 标识符 替换文本
1 | |
函数式宏
#define 宏名(参数列表) 替换文本
1 | |
注意事项
括号保护:参数和整个表达式都应加括号,避免运算符优先级问题。
1
2#define ADD(a, b) a + b // ADD(2, 3) * 4 会展开为 2 + 3 * 4 = 14
#define ADD(a, b) ((a) + (b)) // 展开为 ((2) + (3)) * 4 = 20
参数不计算:宏参数是纯文本替换,不会提前求值
预处理器操作符#与##
操作符(字符串化)
将宏参数转换为字符串常量,参数会被直接转换为字符串,不会进行表达式求值或变量替换;如果参数本身是字符串,会自动添加额外的引号(例如 “abc” 会变成 “\”abc\””)。
1 | |
使用 gcc -e 指令查看预宏展开后的文件如下
1 | |
操作符(记号链接)
## 操作符用于将两个预处理记号(token)连接成一个新的记号。它可以在宏定义的参数列表或替换文本中使用。
1 | |
define与const
#define 和 const 都可用于定义常量,但它们的实现机制、作用域和使用场景有本质区别。
条件编译
宏定义也可以用于条件编译1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifdef DEBUG
#define LOG(msg) printf("[DEBUG] %s\n", msg)
#else
#define LOG(msg) // 空定义,忽略日志
#endif
// 检查系统平台
#ifdef __linux__
#define PLATFORM "Linux"
#elif defined(_WIN32)
#define PLATFORM "Windows"
#else
#define PLATFORM "Unknown"
#endif