序言过去,当使用typedef和define进行声明时,我总是觉得没有区别。
两种使用方法是相同的。
但是,当我最近阅读“ C陷阱和缺陷”时,我发现有很大的不同,因此有必要进行总结和记录。
参考文献the参考网站的一部分如下C语言宏:https://developer.aliyun.com/article/7434参考书如下“ C Primer Plus第六版”。
P478“ C陷阱和缺陷”; P100“ C ++ Primer Plus第六版” 》 P248问题的根源我在学习“ C陷阱和缺陷”时遇到了这样的问题。
#定义T1 struct foo * typedef struct foo * T2; T1 a,b; T2 a,b; struct foo * a,b;宏定义方法,声明扩展,T1struct foo * a,* b;类型定义方式,将语句展开。
当时我看了T2,之后,我总是很困惑,对这种指针不了解很多。
我从来不明白为什么T2推出后会是什么样子?如果您已经了解它,那就太好了,这是个很大的不同!如果您不了解它,没关系,我将在下面自行分析。
分析与总结consulting查阅相关参考资料后,我了解了一个基本事实;使用define宏定义只是名称的替代;使用typedef类型定义,出来后,它是一个实型。
然后,我看到了来自“ C Primer Plus”的另一个例子。
#define BYTE unsigned char // typedef与#define函数typedef char * STRING重叠; #定义函数STRING的名称,符号; char * name,* sign; #define STRING char *定义多个变量时,只有第一个有效。
STRING名称,符号;字符*名称,符号;从上面的伪代码中可以看到,当仅用于名称定义时,typedef具有与define相同的作用。
但是当用作其他复杂类型定义时,这两种方法的结果却大不相同!例如,在代码中,您需要使用typedef定义char *的类型,并使用typedef对其进行定义,如下所示:typedef char STRING; // typedef类型声明STRING名称,符号;变量声明char * name,* sign;语句扩展结果但是,如果使用define语句,结果显然会有所不同。
示例代码如下:#defineSTRING char * //声明STRING,当遇到STRING时,将其替换为char * STRING名称,符号; //变量声明char * name,sign; //语句扩展的结果如上面的代码所示,当遇到名称为STRING的语句时,仅在预处理过程中使用define语句,将其完整替换为(char *),就这样! (您可以在此处使用define来考虑其他陷阱,稍后我们将对其进行详细总结。
)imp简单总结一下原因。
如果没有typedef关键字,则编译器会将STRING识别为指向char的指针变量。
如果使用typedef关键字,则编译器会将STRING解释为类型的标识符,该类型是char的指针;总而言之,以这种typedef方式,编译器将STRING解释为类型的标识符!这个过程由编译器处理!这种定义方法只是替换名称。
此过程在预处理器中处理!请记住这两个摘要,以避免更多类似的陷阱。
再次重复,定义只是替换名称,而typedef是类型标识符! ! ! -END-来源| BabyCoder作者| FightingBoom |本文旨在传播相关技术,版权归原作者所有。
| |如果有任何侵权,请联系以将其删除| [1]为什么MCU同时具有闪存和EEPROM? [2]“历史上最糟糕的代码”! [3] goto语句的对与错[4] C语言内存操作的陷阱!你踩坑了吗? [5] RTOS如何划分任务?