前言 以前在使用 typedef 与 define 作声明时,总感觉没啥区别,两个的使用方法都一样,但是最近在看《C 陷阱与缺陷》时,才发现大有不同,因此还是有必要总结记录一下。 参考资料部分参考网址如下 参考书本资料如下
在学习《C 陷阱与缺陷》时,遇到这样一个问题,搞不明白,然后翻阅资料,才理解其中含义! #define T1 struct foo *typedef struct foo *T2; T1 a, b;# a) a& j; A3 W$ K; E T2 a, b; 9 Y" y$ p& d1 \+ d r) k& t) l2 F+ ] struct foo *a, b; // 宏定义方式,声明展开,T19 B( e( _- @$ ~4 f struct foo *a, *b; // 类型定义方式,声明展开,T2. c* O6 b' y! m/ l' |& L 我当时看了之后,对这种带指针的总是迷迷糊糊,不甚了解。一直不明白为什么 T2 展开之后是这个样子? 如果你已经看懂了,那很棒,这就是一个很大的区别!如果没看懂,没关系,下边我也会自己分析。 分析总结我在查阅相关参考资料之后,明白了一个基本的事实;
接着,我从《C Primer Plus》中看到了另外一个例子 #define BYTE unsigned char // typedef 与 #define 功能重合6 ^3 _% f! [- P+ V4 H+ W$ K typedef char * STRING; // #define 没有的功能 STRING name, sign; char *name, *sign;7 H7 `& j' T1 \/ W0 u- j #define STRING char * // 定义多个变量时,导致只有第一个有效。! _; o* H% g9 P STRING name, sign;) ?; R5 `7 x% j2 L- P char *name, sign;$ T- l) ]! @2 V5 |% c 由上述伪代码可以看到,当只用作名称定义时, typedef 与 define 作用一样。 但是当用作其他复杂类型定义时,这两种方式,使用出来的结果,大不相同! 比如代码中,要使用 typedef 定义一个 char * 的类型,使用 typedef 定义如下: typedef char * STRING; // typedef类型声明STRING name, sign; // 变量声明 char *name, *sign; // 声明展开结果7 J0 a; |* Z9 ^! _ 但是如果使用 define 声明的结果,很显然不同,示例代码如下: #define STRING char * // 声明STRING,当遇到STRING时,替换为char *STRING name, sign; // 变量声明 char *name, sign; // 声明展开结果0 Q' G0 `# e! g) L, g$ ] 从上述代码可以看到,使用 define 声明的结果,只是在预处理过程中,遇到名字为 STRING 的声明,就原封不动的替换为 ( char * ) ,仅此而已!(此处可以联想到使用 define 的其他陷阱,后续再细细总结。) 简单的总结一下原因
|