typedef和define的区别

来源:互联网 发布:手机投影软件 编辑:程序博客网 时间:2024/05/18 03:51

typedef和define的区别

     typedef是相当于重新定义一种类型,而define仅仅是简单的字符串替换

常用的陷阱是使用define来使用多个变量的替换,容易出错。

     举个例子:

     1.#define int *  PINTA

     2.typedef int * PINTB

     使用上边的两种例子来定义两个变量

     3.PINTA a,b;

     4.PINTB c,d;

     第3行中其实a的类型是int *,而b的类型是int,解释一下:在看到define的时候只要把define指定的内容按照原来的情况直接复制下来看结果就行。看PINTA a,b直接转换为int *a, b;这样就很明显的看到a的类型是int *,b的类型是int.

    第4行中c和d的类型都是int *,原因就是typedef是将int *直接定义为PINTB,这样c和d的类型就都是int *了。

 

问题扩展:

       一:使用define来定义宏的时候,一定要将定义的宏直接复制到所用到的地方来看值。最常见的错误是使用define来定义表达式

        举例:

        #define f(x) x+3

        使用的时候5*f(3)结果为18,解释还是先将宏简单的复制下来5*3+3结果是18,如果想要表达式的结果正确那就将宏定义的时候使用括号

       #define g(x) (x+3)

       使用的时候5*g(3)结果就为5*(3+3)=30

    二:在使用typedef时,不能使用存储类关键字(auto、extern、static、register等),编译器会报错

        举例:

         typedef   static   int   INT32_A;

        error C2159: more than one storage class specified

    三:

       看着define有很多缺陷,是不是最好不用呢。其实不然,define有很多好处,比如定义一个常量

       #define  MAX_LEN  24

      程序中使用起来比较方便,如果需要修改直接修改MAX_LEN对应的值就行。

       define还有一种比较实用的用法就是定义出参还是入参

      #define IN

      #define OUT

      使用IN或者OUT在函数的定义的时候,代码的可读性比较强

      比如int GetValue(IN int a,OUT int *b)程序能一眼看出来第一个参数是入参,第二个参数是出参

 

总结:

      只要记住一条define仅仅是简单的字符串替换就可以了