#define 标识符 字符串
说明:
1、 宏名一般习惯用大写字母表示,以便与变量名区别,但并非规定;
2、 宏定义只是做简单的置换,不做正确性检查,预编译是不作任何语法检查;
3、 宏定义不是C语句,不必在行末加分号,如果加了会连分号一起进行置换;
4、 宏名的有效范围为定义命令之后到本源文件结束,通常放在文件的开头,在此文件范围内有效;
5、 可以用#undef命令终止宏定义的作用域;
6、 在进行宏定义时,可以引用已定义的宏名,可以层层置换;
7、 宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间
带参数的宏定义:
对带参数的宏定义是这样展开置换的:在程序中如果有带实参的宏,则按#define命令行中指定的字符串从左到右进行置换,如果串中包含宏中的形参,则将程序语句中相应的实参代替形参,如果宏定义中的字符串中的字符不是参数字符,如*,则保留,这样就形成了置换的字符串。
带参数的宏与函数的区别:
1、 函数调用时,先求出实参表达式的值,然后代入形参;而带参数的宏只是进行简单的字符替换。
2、 函数调用是在程序运行时处理的,为形参分配临时的内存单元;而宏展开则是在编译前进行,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念;
3、 对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换;而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。
4、 调用函数只可得到一个返回值,而用宏定义可以设法得到几个结果。(用分号隔开)
通过一道面试题来加深理解:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个!
#define MIN(A,B) ((A)<= (B) ? (A) : (B) )
这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。
程序员对宏定义的使用要非常小心,特别要注意两个问题:
(1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:
|
#define MIN(A,B) (A) <= (B) ? (A) : (B) |
都应判0分;
(2)防止宏的副作用。
least = MIN(*p++, b);
将被替换为:
( (*p++) <= (b) ?(*p++):(b) )
在条件判断和后面取值时都进行了++操作,和题意不符;
浙公网安备 33010602011771号