C语言type 与 #define 定义区别
宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。
#define
PIN1
int
*
typedef
(int
*)
PIN2;
从形式上看这两者相似,
但在实际使用中却不相同。
下面用PIN1,PIN2说明变量时就可以看出它们的区别:
PIN1
a,b;在宏代换后变成:
int
*a,b;
表示a是指向整型的指针变量,而b是整型变量。
然而:
PIN2
a,b;
表示a,b都是指向整型的指针变量。因为PIN2是一个类型说明符。由这个例子可见,宏定义虽然也可表示数据类型,
但毕竟是作字符代换。在使用时要分外小心,以避出错。
其实一般情况下,这两种办法都能够达到预期的效果。
但是有时候要注意define宏的副作用,比如下面这种情况:
typedef unsigned int *uint; //这时候uint是一个指向unsigned int数据的指针类型,注意这里是指针类型了
#define uint unsigned int * //下文每出现uint的时候就用unsigned int * 来代替,这是这个语句的本质原理(该宏的作用)
又如有以下语句:
uint a, b ;
如果是用上述typedef语句,则这里a,b均是一个指针变量,这个指针指向unsigned int类型的数据,
而如果用的是define语句,则这里展开后变成:
unsigned int * a, b;
这里a是一个指针了, 而b是一个unsigned int类型的数据。
注意这些就基本差不多了。
详情请参考《C陷阱与缺陷》一书6.2章!
祝你好运!
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!