C++语言程序设计

下面是带参数的宏定义的例子：

| 例9-4

#include <iostream.h>
#define SUB(a,b) a-b
void main ()
{
int x,y,result;
x=2;
y=3;
result=SUB(x+2,y-1);
cout<< "result="<<result<<end1;
}
该程序经宏替换后，main函数变为：
void main ()
{
int x,y,result;
result=x+2-y-1;
cout<< "result="<<result<<end1;
}

执行该程序后，输出结果如下：
result=0
虽然带参数的宏定义和带参数的函数很相似，但它们还是有本质上的区别：
（1） 在带参的宏定义中，形式参数不是变量，只是一个符号，不分配内存单元，不必定义其形式参数的类型。发生宏"调用"时，只是将实参替换形参。而在函数中，形参和实参是完全独立的变量，它们均有自己的作用域。当调用发生时，实参传递给形参的过程（值传递或引用传递）完全不同于简单的宏替换。
（2） 在宏定义中的形参是标识符，而宏调用中的实参可以是表达式。如：

| 例9-5

#include <iostream.h>
#define SQ(y) (y)*(y)
void main()
{
int x, result;
cout<<"input a number: "<<endl;
cin>>x;
sq=SQ(x+1);
cout<<"result="<<endl<<result;
}

上例中"#defint SQ(y) (y)*(y)"一行为宏定义，形参为y。程序中宏调用时实参为x+1，是一个表达式，在宏展开时，用x+1代换y，再用(y)*(y) 代换SQ，得到如下语句："result=(a+1)*(a+1); "，这与函数的调用是不同的， 函数调用时要把实参表达式的值求出来再赋予形参。而宏代换中，对实参表达式不作计算直接地照原样替换。