C++语言程序设计

带参数的宏定义和带参数的函数在形式上很相似，却有本质上的区别：
（1）在带参的宏定义中，宏"调用"只是将实参替换形参。而在函数中，形参和实参是完全独立的变量，当调用发生时，实参的值传递给形参。
从发生的时间来说，宏"调用"是在编译时发生的，函数调用是在程序运行时发生的；宏"调用"不存在内存单元分配的问题，而函数调用时，会给形参变量分配内存单元，然后，复制实参的值，函数调用结束后，形参变量占用的内存单元被释放。
（2）在宏定义中的形参是标识符，而宏调用中的实参可以是表达式。如：

| 例9-7

#include <iostream.h>
//将系统输入输出流头文件包含进来
#define SQ(y) (y)*(y)
//用带参数的宏定义定义了一个宏SQ(y)
void main()
{
int x, result;
cout<<"input a number: "<<endl;
cin>>x;
sq=SQ(x+1);
//调用该宏
cout<<"result="<<endl<<result;
//输出result的值，观察宏替换产生的结果
}

对于上边的例程而言，第二行
"#define SQ(y) (y)*(y)"
中的"(y)*(y)"的括号是必需的，因为对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参。如果不加括号，即：
"#define SQ(y) y*y"
则后面的语句：
"sq=SQ(x+1);"
把实参"x+1"代替"y*y"中的形参"y"成为：
"sq=x+1*x+1;"
这显然与程序设计原来所希望得到的结果"(x+1)*(x+1)"不符，因此必须要在y的外面加上括号。