#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)
#define MIN(A,B) (A <= B ? A : B )


  都应判0分;

2)防止宏的副作用。

  least = MIN(*p++, b);
 将被替换为:
( (*p++) <= (b) ?(*p++):(b) )

     在条件判断和后面取值时都进行了++操作,和题意不符;


 

 

posted on 2009-02-01 20:16  陈广强  阅读(2718)  评论(0)    收藏  举报