带参数的宏定义的一般格式如下:
带参数的宏展开时,需要进行参数替换。将形参表中的形参用实参替换。例如:
其中,S(r)为带参数的宏。例如,在程序中使用S(7)时,是用7代替宏定义中的形参r,S(7)展开为3.14159×7×7。
关于带参数的宏定义,有以下几点说明:
(1)在使用带参数的宏定义时,宏名和括号之间不能有空格,否则系统会把括号、形参和字符串认为是一个字符串。例如:
这种写法是错误的。系统会认为H是不带参的宏名(代表字符串“(x,y)sqrt(x*y)”)。
(2)带参数的宏可以有多个参数。例如,下面定义了一个用于计算圆柱体积的宏。
其中,参数r代表圆柱的半径,参数h代表圆柱的高。V(8,10)展开为3.14159×8×8×10。
(3)带参数的宏在展开时,按宏定义中指定的字符串,从左到右用实参置换形参,宏定义中的其他字符则保留。
例如,上面定义的V(r,h)用实参(8和10)代替字符串中的形参(r和h),8置换r,10置换h,而*保留。
例7.2 使用带参数的宏计算长方体的表面积。
【分析】本题可以使用带3个参数的宏来计算长方体的表面积,这3个参数分别代表长方体的长、宽、高。
程序代码如下:(www.daowen.com)
S(a,b,c)展开为2×(a×b+b×c+c×a),因此程序实际执行的是下面的赋值语句:
如果从键盘输入的长、宽、高是2、3、4,则输出的表面积是52。
如果将上面的S(a,b,c)换成S(2,3,1+3),那么运行程序后的输出结果还是52吗?接下来,对此进行分析。
S(2,3,1+3)展开应该是2×(2×3+3×1+3+1+3×2),也就是说,用1+3(不是用1+3的结果4)代替形参c,所以展开后的赋值语句是“area=2×(2×3+3×1+3+1+3×2);”,显然输出的结果不会是52。原因在于:宏展开仅仅是替换。若将例7.2中的宏如下定义,就不会出错了。
这样定义后,在用实参替换形参时,由于形参放在括号中,因此实参是常量、变量或表达式都可以,如上面的S(2,3,1+3)就不会出错了。
以上介绍了用带参数的宏来计算长方体的表面积,这类问题显然也可以用函数来解决。带参数的宏和函数既有相类似的地方,又有许多不同点。
(1)宏展开只是替换;函数调用时,要先计算实参表达式的值,然后将值传递给形参,而不替换形参。
(2)宏名以及它的参数都不存在类型问题,展开时用指定的字符串替换即可;函数中的实参和形参都要定义类型。
(3)宏展开在编译时进行,不占用程序运行时间,在展开时不分配内存单元(即使带参数的宏也不分配内存单元);函数调用是在程序运行时进行处理,占用程序运行时间,而且要为形参和函数中的局部变量分配临时内存单元。
(4)函数调用时,有从实参向形参传递数据的过程;使用带参数的宏没有传递数据的过程。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。