|
前言 以前在使用 typedef 与 define 作声明时,总感觉没啥区别,两个的使用方法都一样,但是最近在看《C 陷阱与缺陷》时,才发现大有不同,因此还是有必要总结记录一下。 参考资料部分参考网址如下
参考书本资料如下
在学习《C 陷阱与缺陷》时,遇到这样一个问题,搞不明白,然后翻阅资料,才理解其中含义! #define T1 struct foo *# U3 U8 g F% Z G/ S" j. Utypedef struct foo *T2; T1 a, b;; Q" ~) H7 T8 m8 `" K T2 a, b; struct foo *a, b; // 宏定义方式,声明展开,T1 struct foo *a, *b; // 类型定义方式,声明展开,T25 ?) i. p* m. _ 我当时看了之后,对这种带指针的总是迷迷糊糊,不甚了解。一直不明白为什么 T2 展开之后是这个样子? 如果你已经看懂了,那很棒,这就是一个很大的区别!如果没看懂,没关系,下边我也会自己分析。 分析总结我在查阅相关参考资料之后,明白了一个基本的事实;
接着,我从《C Primer Plus》中看到了另外一个例子 #define BYTE unsigned char // typedef 与 #define 功能重合7 Q/ u+ p5 `1 X. ?+ B* T% `8 V% d. @; a7 W4 m' R9 A typedef char * STRING; // #define 没有的功能6 g f% Y3 i/ L5 p. b STRING name, sign; char *name, *sign; 0 T0 A; ~- Q- [6 V #define STRING char * // 定义多个变量时,导致只有第一个有效。 STRING name, sign;; U! \* c2 ~0 a! X3 |3 J1 H( L2 ? char *name, sign; 由上述伪代码可以看到,当只用作名称定义时, typedef 与 define 作用一样。 但是当用作其他复杂类型定义时,这两种方式,使用出来的结果,大不相同! 比如代码中,要使用 typedef 定义一个 char * 的类型,使用 typedef 定义如下: typedef char * STRING; // typedef类型声明: R4 S2 w3 E) Z7 o& [. y6 E ESTRING name, sign; // 变量声明8 v5 a& [% |1 f/ }/ r% }- s char *name, *sign; // 声明展开结果 但是如果使用 define 声明的结果,很显然不同,示例代码如下: #define STRING char * // 声明STRING,当遇到STRING时,替换为char *1 V9 S0 V) F: d' a) rSTRING name, sign; // 变量声明+ F9 A2 e- I1 g& l char *name, sign; // 声明展开结果4 p* }& m8 M, \. ~4 F8 E 从上述代码可以看到,使用 define 声明的结果,只是在预处理过程中,遇到名字为 STRING 的声明,就原封不动的替换为 ( char * ) ,仅此而已!(此处可以联想到使用 define 的其他陷阱,后续再细细总结。) 简单的总结一下原因
|
微信公众号
手机版