|
宏的定义形式为: #define 宏名 宏体
要注意以下几点:
1、书写时,#define与宏名之间、宏名与宏体之间均以(一个或多个)空格隔开,也即从宏名后的第一个非空格字符开始,直到本行结束之间的符号均作为宏体看待,看下面的例子:
若宏替换命令行后面加了分号,则该分号将成为宏体的一部分。
如:#define N 8;
则宏体应该是8;(分号也包括在内!)
这时,如果遇到语句
for(i=0;i<N-1;i++){...}
则宏替换后的形式为:
for(i=0;i<8;-1;i++){...}
该程序在编译时将无法通过,问题也很难查出来。
切记:定义宏的时候,宏体后面千万不要加分号,除非你本来就需要在宏体中加入这个分号!
2、宏替换过程
在进行宏替换时,要注意将宏名按定义时宏体的形式原封不动地代入表达式中,不要增加任何其他的符号(尤其是小括号!),看下面的例子:
有如下程序
#define N 2
#define M N+1
#define NUM 2*M+1
main()
{
int i;
for(i=1;i<=NUM;i++) printf("%d\n",i);
}
则该程序中for循环执行的次数是
A)5 B)6 C)7 D)8
为获得宏名NUM的替换结果,先将宏名M的宏体N+1替换进去,得到NUM的形式为:2*N+1+1,注意不能给M的宏体N+1随意加小括号,写成2*(N+1)+1,这是最容易犯的错误!!然后将N的宏体替换进去,最后得到NUM的形式为2*2+1+1,该表达式的值为6,因此上述题目的正确答案为(B)。这是2000年9月二级C中的一道选择题。
切记:在进行宏替换时,不要随意给宏体加上小括号,除非宏定义中本身就有小括号!
3、宏体不被替换的情况
(1) 双引号中的与宏名相同的字符串将不被替换;
(2) 用户标识符中只有一部分与宏名相同的字符串将不被替换。
如有宏定义 #define PI 3.1415926
则:语句 printf("PI is 3.14");和 int myPI;中的"PI"均不被作为宏名而替换。
|
|