C语言小贴士10:#define和typedef的区别(总第189期)
在typedef和#define宏替换之间看似相同,实际上却是有着根本性的区别的,typedef就是一种彻底的封装类型,在声明它之后不能再往里面添加别的东西,它和#define宏之间有两个非常明显的应用区别。
可以使用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做。如下所示:
#define apple int
unsigned apple i; //这样是没有问题的
但是如果有typedef的用法如下:
typedef int apple;
unsigned apple i; //这样是错误不允许的
其次,在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量都是用一种数据类型,而用#define定义的类型则无法保证。如下所示:
#define int_ptr int *
int_ptr a, b;
经过宏扩展后,第二行变为:
int *a, b;
这使得a和b成为不同的数据类型,a是一个指向int的指针,而b则是一个int类型的变量。
相反,在下面的代码中:
typedef int * int_ptr;
int_ptr a, b;
则此时a和b的类型相同,都是指向整形变量的指针。
从以上分析可以看出,typedef和#define还是有着本质的区别的。
详细的视频讲解如下所示: