当前位置: 首页 > 科技观察

C语言宏定义有哪些盲点?

时间:2023-03-13 07:12:32 科技观察

1。概念命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。(1)简单的宏定义:#define<宏名> #defineVALUE((sizeof(a))/sizeof(a[0]))(2)带参数的宏定义#define<宏名>()#defineMAX(a,b)((a)>(b)?(a):(b))2.宏定义中不能忽略空格f中是否有参数宏定义?#definef(x)((x)+1)答案是否定的,f和(x)之间有一个空格,导致如下定义。#definef(x)((x)+1)预处理器不检查它。如果有错误,只能在编译经过宏扩展的源程序时才能发现。3.宏不是函数。如果我们定义一个宏:#defineMAX(a,b)a>b?a:b当我们执行语句时:3+MAX(1,3);我们期望的答案应该是6,实际运行后答案是1。链接到宏定义是优先的。算术运算符比条件运算符具有更高的优先级。展开如下。3+1>3?1:3,先进行运算符运算,即4>3?1:3,所以答案为1。注意宏定义中的括号,这些是为了防止与优先级相关问题。一些专家建议,在C语言中记住两个优先级就足够了。乘法和除法的优先级高于加法和减法。在设计其他运算符时,请始终添加括号。4.宏定义不是描述或声明。不必在行尾添加分号。如果加了分号,连分号也会一起替换掉。5.宏不是类型定义。先定义一个宏#definepCharchar*然后用pChar定义两个变量,然后用运算符sizeof读取变量占用的内存大小。如果是指针类型会占用4个字节,如果是字符类型会占用1个字节。这样一来,占用的空间不同,变量类型自然也就不同,所以宏定义不是类型定义。那么如果我切换到typedef来定义类型呢?宏定义只是简单的字符串替换,在预处理时完成,而typedef在编译时处理。这不是简单的替换,而是类型说明符的重命名。命名标识符具有类型定义规范。6.相关宏定义在编写程序的过程中,很多都需要条件编译。让我们看一个常见的使用方法。#ifdefined(CREDIT)credit();#elifdefined(DEBIT)debit();#elseprinterror();#endif7.摘要宏的本质是代码替换。