清华大学出版社 TSINGHUA UNIVERSITY PRESS 参数a、b,即用3*2代替s(3,2)。因此赋值语句展 开为area=3*2; 对带参的宏定义是这样展开置换的:在程序中如果 有带实参的宏(如S3,2),则按#define命令行中 指定的字符串从左到右进行置换。如果串中包含 宏中的形参(如a、b),则将程序语句中相应的实 参(可以是常量、变量或表达式)代替形参,如果宏 定义中的字符串中的字符不是参数字符(如a*b中 的*号),则保留。这样就形成了置换的字符串, 见图9.1
参数a、b,即用3*2代替s(3,2)。因此赋值语句展 开为area=3*2; 对带参的宏定义是这样展开置换的:在程序中如果 有带实参的宏(如S(3,2)),则按#define命令行中 指定的字符串从左到右进行置换。如果串中包含 宏中的形参(如a、b),则将程序语句中相应的实 参(可以是常量、变量或表达式)代替形参,如果宏 定义中的字符串中的字符不是参数字符(如a*b中 的*号),则保留。这样就形成了置换的字符串, 见图9.1
清华大学出版社 TSINGHUA UNIVERSITY PRESS 例9.3 #definePI3.1415926 #define S(r) PI*r*r mainO float a,area; a=3.6; area-S(a); printf("r=%fnarea=%fn",a,area); 运行结果如下: =3.600000 area=40.715038
例9.3 #definePI3.1415926 #define S(r) PI*r*r main() {float a,area; a=3.6; area=S(a); printf("r=%f\narea=%f\n",a,area); } 运行结果如下: r=3.600000 area=40.715038
清华大学出版社 TSINGHUA UNIVERSITY PRESS 赋值语句area=s(a);经宏展开后为 area=3.1415926*a*a; 说明: ()对带参数的宏的展开只是将语句中的宏名后面括 号内的实参字符串代替#definer命令行中的形参。例 9.3中语句中有S(a),在展开时,找到#define命令行 中的S(r),将S(a)中的实参a代替宏定义中的字符串 “PI*r*r”中的形参r,得到PI*a*a。这是容易理解 而且不会发生什么问题的。但是,如果有以下语句: area=S(a+B);这时把实参a+B代替PI*r*r中的形参r, 成为area=PI*a+B*a+B;请注意在a+B外面没有括弧, 显然这与程序设计者的原意不符。原意希望得到
赋值语句area=s(a);经宏展开后为 area=3.1415926*a*a; 说明: (1) 对带参数的宏的展开只是将语句中的宏名后面括 号内的实参字符串代替#define命令行中的形参。例 9.3中语句中有S(a),在展开时,找到#define命令行 中的S(r),将S(a)中的实参a代替宏定义中的字符串 “PI*r*r”中的形参r,得到PI*a*a。这是容易理解 而且不会发生什么问题的。但是,如果有以下语句: area=S(a+B);这时把实参a+B代替PI*r*r中的形参r, 成为area=PI*a+B*a+B;请注意在a+B外面没有括弧, 显然这与程序设计者的原意不符。原意希望得到
清华大学出版社 TSINGHUA UNIVERSITY PRESS area=PI*(a+B)*(a+B);为了得到这个结果,应当在定 义时,在字符串中的形式参数外面加一个括弧。即 #define S(r)PI*(r)*(r)在对S(a+B)进行宏展开时,将 a+B代替r,就成了PI*(a+B)*(a+B)这就达到了目的。 (2)在宏定义时,在宏名与带参数的括弧之间不应加空 格,否则将空格以后的字符都作为替代字符串的一部 分。例如,如果有 #define s (r)PI*r*r 被认为s是符号常量(不带参的宏名),它代表字符串“() PI*r*r”。如果在语句中有area=S(a); 则被展开为 area=(r)PI*r*r(a) 显然不对了
area=PI*(a+B)*(a+B);为了得到这个结果,应当在定 义时,在字符串中的形式参数外面加一个括弧。即 #define S(r) PI*(r)*(r)在对S(a+B)进行宏展开时,将 a+B代替r,就成了PI*(a+B)*(a+B)这就达到了目的。 (2) 在宏定义时,在宏名与带参数的括弧之间不应加空 格,否则将空格以后的字符都作为替代字符串的一部 分。例如,如果有 #define s (r)PI*r*r 被认为s是符号常量(不带参的宏名),它代表字符串“(r) PI*r*r”。如果在语句中有area=S (a); 则被展开为 area=(r) PI*r*r (a) 显然不对了