vlambda博客
学习文章列表

C语言小贴士10:#define和typedef的区别(总第189期)

在typedef和#define宏替换之间看似相同,实际上却是有着根本性的区别的,typedef就是一种彻底的封装类型,在声明它之后不能再往里面添加别的东西,它和#define宏之间有两个非常明显的应用区别。

  1. 可以使用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做。如下所示:

    #define apple int

    unsigned apple i;   //这样是没有问题的

    但是如果有typedef的用法如下:

    typedef int apple;

    unsigned apple i;   //这样是错误不允许的

  2. 其次,在连续几个变量的声明中,用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还是有着本质的区别的。

详细的视频讲解如下所示: