| 上一篇 | 下一篇 |
|---|---|
| 数组名,以及和指针的区别(一/二维数组) |
#define 和 typedef 的区别
具体区别:
| 对比项 | #define | typedef |
|---|---|---|
| 功能 | 文本替换、定义标识符 | 创建已有类型的别名 |
| 类型 | 预处理指令 | 关键字 |
| 执行时机 | 预处理阶段(编译前) | 编译阶段 |
| 作用域 | 从定义到文件结束(或 #undef) |
遵循 C 作用域规则(如块、函数、文件) |
| 应用场景 | 条件编译;定义常量、宏函数 | 创建已有类型的别名 |
语句结尾是否要加 ; |
不加 ; |
加 ; |
他们最大的区别就是:作用于已有类型时,#define 只是简单的文本替换,而 typedef 创建的别名是具有同等效力的。这一点在 声明多个变量时尤为明显:(看下列注释)
c
#define PTR_INT int*
typedef int* ptr_int;
/* ...... */
PTR_INT a, b; // 等价于:int* a, b; → a 是指针,b 是 int!
ptr_int x, y; // x 和 y 都是指针(int*)
#define 定义的内容,只有定义在 .h 文件中,别的文件才能通过引入头文件的方式,使用到这个内容,如果只是在 .c 文件中定义的话,别的文件就算引入了头文件,也无法使用。
并且 #define 不需要顶格,但必须是该行的第一个非空白字符。在函数内部都可以使用。
总结:
#define是预处理指令,用于文本替换、定义标识符。在预处理阶段(编译前)执行。其作用域是从定义到文件结束(或#undef)。常用于条件编译;定义常量、宏函数。typedef是关键字,用于创建已有类型的别名。在编译阶段执行。在函数内定义:则其作用域遵循 C 的规则(如块、函数、文件),在哪里定义就被限制在哪里(在函数内定义就被限制在函数内,在函数/块之外定义就属于整个文件)。常用于创建已有类型的别名。