带参数的宏定义#define
带参数的宏定义#define本文简介:9.1.2带参数的宏定义带参数的宏定义的一般形式如下:#define()其中,是一个标识符,中的参数可以是一个,也可以是多个,视具体情况而定,当有多个参数的时候,每个参数之间用逗号分隔。是被替换用的字符串,宏体中的字符串是由参数表中的各个参数组成的表达式。例如:#defineSUB(a,b)a-b如
带参数的宏定义#define本文内容:
9.1.2
带参数的宏定义
带参数的宏定义的一般形式如下:
#define
()
其中,
是一个标识符,中的参数可以是一个,也可以是多个,视具体情况而定,当有多个参数的时候,每个参数之间用逗号分隔。是被替换用的字符串,宏体中的字符串是由参数表中的各个参数组成的表达式。例如:
#define
SUB(a,b)
a-b
如果在程序中出现如下语句:
result=SUB(2,3)
则被替换为:
result=2-3;
如果程序中出现如下语句:
result=
SUB(x+1,y+2);
则被替换为:
result=x+1-y+2;
在这样的宏替换过程中,其实只是将参数表中的参数代入到宏体的表达式中去,上述例子中,即是将表达式中的a和b分别用2和3代入。
我们可以发现:带参的宏定义与函数类似。如果我们把宏定义时出现的参数视为形参,而在程序中引用宏定义时出现的参数视为实参。那么上例中的a和b就是形参,而2和3以及x+1和y+2都为实参。在宏替换时,就是用实参来替换中的形参。
下面是带参数的宏定义的例子:
例9-4
#include
#define
SUB(a,b)
a-b
void
main
()
{
int
x,y,result;
x=2;
y=3;
result=SUB(x+2,y-1);
coutx;
sq=SQ(x+1);
cout<<“result=“< } 上例中“#defint SQ(y) (y)*(y)“一行为宏定义,形参为y。程序中宏调用时实参为x+1,是一个表达式,在宏展开时,用x+1代换y,再用(y)*(y) 代换SQ,得到如下语句:“result=(a+1)*(a+1); “,这与函数的调用是不同的, 函数调用时要把实参表达式的值求出来再赋予形参。而宏代换中,对实参表达式不作计算直接地照原样替换。