typedefunsignedlonguint32_t;// 假设平台中 unsigned long 是 32 位
4. 关键区别
特性
#define
typedef
本质
预处理指令,基于文本替换
关键字,定义类型别名
作用时间
编译前(预处理阶段)
编译时
类型检查
无类型检查,完全基于文本替换
有类型检查,确保类型安全
作用范围
文件级(或直到 #undef)
遵循作用域规则
灵活性
更灵活,可用于定义常量、宏函数、条件编译等
仅限于定义类型别名
调试难度
难以调试,因为是文本替换,可能导致意外错误
易于调试,因为是类型定义
5. 示例对比
(1) 使用 #define 定义常量
#defineMAX100int arr[MAX];// 等价于 int arr[100];
在编译前,MAX 被替换为 100。
(2) 使用 typedef 定义类型别名
typedefint Number;
Number a =10;// 等价于 int a = 10;
Number 是 int 的别名,编译器会将其识别为 int。
(3) 对比复杂类型
// 使用 #define#definePTR_INTint*
PTR_INT a, b;// 等价于 int* a, b; (b 是 int 类型,不是指针)// 使用 typedeftypedefint* IntPtr;
IntPtr a, b;// 等价于 int* a, *b; (a 和 b 都是指针)
#define 会导致意外结果,而 typedef 更加安全。
6. 注意事项
(1) #define 的陷阱
副作用:宏函数可能引入副作用。
#defineSQUARE(x)((x)*(x))int a =5;int result =SQUARE(a++);// 展开后为 ((a++) * (a++)),导致未定义行为
括号问题:忘记加括号可能导致错误。
#defineADD(x, y) x + yint result =ADD(2,3)*4;// 展开后为 2 + 3 * 4,结果为 14(而非预期的 20)