6.1 宏定义与预处理
预处理器在真正编译之前先处理源代码。#define 定义宏,本质是编译前的文本替换。
对象宏常用来给常量起名字:
c
#define PI 3.1415926
#define MAX_USERS 100
double area = PI * r * r;带参数的函数宏看起来像函数,但同样是文本替换。参数要用括号包起来,避免优先级错误。
c
#define SQUARE(x) ((x) * (x))
int n = SQUARE(3 + 1); // 展开为 ((3 + 1) * (3 + 1)) = 16如果写成 #define SQUARE(x) x * x,那么 SQUARE(3 + 1) 会展开成 3 + 1 * 3 + 1,结果是 7,这就是漏写括号的经典陷阱。
条件编译可以根据宏是否定义来包含不同代码,常用于调试开关或跨平台:
c
#define DEBUG 1
#if DEBUG
printf("x = %d\n", x);
#endif宏没有类型检查,能用 const 常量和真正的函数时优先使用它们;宏更适合常量命名和条件编译。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...