目录
1.概念
#define 它在编译预处理时进行简单的替换,不作正确性检查。它是预处理指令。
typedef 它在自己的作用域内给一个已经存在的类型一个别名。它是在是在编译时处理的。
2.区别
原理不同
#define 是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。
typedef 是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。而它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
例如:
#define INT1 int
unsigned INT1 n; //(1)
typedef int INT2;
unsigned INT2 n; //(2)
(1) 不会报错,因为INT1是用#define 的宏定义声明的,因此可以使用类型说明符unsigned进行扩展,
(2) 会报错,因为INT2是用typedef 的关键字声明的,因此不能使用unsigned进行扩展。
声明方式不同
#define 的声明方式为:
#define 新名字 旧名字
typedef 的声明方式为:
typedef 旧名字 新名字 ;
需要注意的是,#define之后不带分号,typedef之后带分号。
时间消耗不同
#define 比较考虑大体全局,在编译之前就已经预处理,进行简单替换了,完成了交接工作,几乎不占用时间
而 typedef 比较在意时事安全性,它是在编译的时候才进行出来,并且检测类型是否正确,因此需要消耗一定的时间。
作用域范围不同
#define 由于已经在整体范围内发布声明,因此无论在哪定义过,在其它的地都可以使用
typedef 由于更在意时事性,所以只能在定义的作用域内使用
对指针的操作不同
看到这里,会发现#define好像在性能都比typedef更强,但typedef 真的就完全不如 #define 吗?
对于以下这个例子
#define INT1 int *
typedef int * INT2;
int a =1;
int b =2;
const INT2 p1=&a; //(1)
*p1=1;
p1=&b; //(2)
const INT1 p2 =&a;//(3)
p2=&b;
*p2=1; //(4)
(1) 相当于 int * const p1; p1 不可以更改但指向的内容能被修改,因此(2)会报错
(3) 相当于 int * const p1; p1 不可以更改但指向的内容能被修改,因此(4) 会报错
定义变量的类型保证度上不同
在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。
例如
#define INT1 int*;
P_INT1 p1,p2; //即int *p1,p2;
typedef int* INT2;
P_INT2 p1,p2; //p1、p2 类型相同
INT1所定义的p1与p2类型不同,即p1为指向整形的指针变量,p2为整形变量;
INT2定义的p1与p2类型相同,即都是指向 int 类型的指针。