题目:
定义宏swap(t, x, y)以交换t类型的两个参数。(使用程序块结构会对你有所帮助)
自我解答:
#include <stdio.h>
#define swap(t, x, y) t temp = x;\
x = y;\
y = temp;
#define dprint(expr) printf(#expr " = %g\n", expr)
int main()
{
double i = 3, j = 4;
dprint(i);
dprint(j);
swap(double, i, j);
dprint(i);
dprint(j);
return 0;
}
运行结果
i = 3
j = 4
i = 4
j = 3
本题使用了dprint宏进行了调试,确实很方便
参考答案:
#define swap(t, x, y) { t _z; \
_z = y; \
y = x; \
x = _z; }
我们利用花括号定义了一个新的程序块。程序块允许我们在它的开头部分对在该语句块内使用的局部变量作出声明。为了交换两个参数的值,我们生命了一个类型为t的局部变量_z。
上面这个swap宏只有在两个参数名都不是_z的前提下才能工作。如果两个参数名之一是_z,如:
swap(int, _z, x);
那么,这个宏在展开时就会成为
{int _z; _z = _z; _z = x; x = _z;}
从而导致两个参数的值无法交换。所以,我们写的两个swap宏是以_z不会被用作变量名为假设前提的。
总结:
在自我解答中没有使用程序块,这会导致一个严重的问题,即不能在一个函数中多次使用swap宏,因为会重复定义相同的变量temp.
另外正如参考答案中所指出的那样,两个参数名都不能和temp重合,所以对于这个变量的定义应该比较独特一些,使用_开头的变量名会更好一点。