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仅仅是简单的字符串替换就可以了