#define 与 typedef 完整区别(C语言)
1.本质不一样
#define 宏定义(预处理指令)
#define INT int
- 预处理阶段,简单文本替换,无脑字符串复制,没有类型检查
- 不属于C语句,末尾不要分号,加了分号分号也会被替换进去!
typedef(类型重定义)
typedef int INT;
- 编译阶段,给已有数据类型起一个别名,是编译器认可的类型名
- 属于关键字,后面必须加分号
#define P_INT int*
P_INT a,b;
// 展开后:int* a,b;
// a是指针,b只是普通int!!
typedef int* P_INT;
P_INT a,b;
// a、b全都是 int* 指针
👉宏是无脑替换,typedef才是真正类型别名
#define P_INT int*
const P_INT p;
//展开: const int* p; 指针可改,指向内容不可改
typedef int* P_INT;
const P_INT p;
//等价于 int* const p; 指针本身不可修改
//typedef
typedef struct{
int x;
}Point;
Point p1;
//#define
#define Point struct{int x;}
Point p1;
结构体这里两者效果勉强一样,但推荐typedef
| 对比项 | #define | typedef |
| 阶段 | 预处理(文本替换) | 编译(类型别名) |
| 分号 | 不能加; | 必须加; |
| 指针多行声明 | 会出错 | 所有变量都是指针类型 |
| const修饰 | 效果不一样 | 把整个类型绑定 |
| 作用范围 | 全局,无脑替换 | 类型,编译器识别 |