C++语言程序设计

在使用带参数的宏定义时需要注意的是：
（1）带参数的宏定义的<宏体>应写在一行上，如果需要写在多行上时，在每行结束时，使用续行符 "\"结束，并在该符号后按下回车键，最后一行除外。
（2）在书写带参数的宏定义时，<宏名>与左括号之间不能出现空格，否则空格右边的部分都作为宏体。例如：
#define ADD (x,y) x+y
将会把"（x,y）x+y"的一个整体作为被定义的字符串。
（3）定义带参数的宏时，宏体中与参数名相同的字符串适当地加上圆括号是十分重要的，这样能够避免可能产生的错误。例如,对于宏定义：
#define SQ(x) x*x
当程序中出现下列语句：
m=SQ(a+b);
替换结果为：
m=a+b*a+b;
这可能不是我们期望的结果，如果需要下面的替换结果：
m=(a+b)*(a+b);
应将宏定义修改为：
#define SQ(x) (x)*(x)
对于带参的宏定义展开置换的方法是：在程序中如果有带实参的宏（如"SUB（2,3）"），则按"#define"命令行中指定的字符串从左到右进行置换。如果串中包含宏中的形参（如a、b），则将程序语句中相应的实参（可以是常量、变量或者表达式）代替形参，如果宏定义中的字符串中的字符不是参数字符（如a-b中的-号），则保留。这样就形成了置换的字符串。如下图所示：

| 图9-1

| 例9-6

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