众所周知,C语言支持宏定义,并且功能强大。举个例子:
#include <stdio.h>
#define swap(a,b) {int t=a;a=b;b=t;}
int main()
{
int x = 1, y = 2;
swap(x, y);
printf("%d %d\n", x, y);
return 0;
}
如果不知道swap是如何定义的,你甚至会怀疑这个代码的正确性,或者认为这不是C的代码(为何这么说,请联系C语言函数参数传递方式以及C++中的引用思考)。
有的人很喜欢使用宏定义,以来可以装X(这不是重点),二来宏定义可以稍微提升效率(免去了函数调用的一堆传参、跳转的过程),等等。
不过,宏定义虽然强大,但是有时候却难以驾驭它。
上述宏定义
#define swap(a,b) {int t=a;a=b;b=t;}
乍一看没什么问题,里面使用了变量t,如果宏定义外面也有变量叫t怎么办?这个不用担心,因为我们使用了花括号,这个t是不会和外界相互影响的。确实很完美。不过,你是否发现这样的问题?
这个代码:
#include <stdio.h>
#define swap(a,b) {int t=a;a=b;b=t;}
int main()
{
int x = 1, y = 2,z = 3;
if (x > y)
swap(x, y);
else
swap(y, z);
printf("%d %d %d\n", x, y, z);
return 0;
}
是无法正常编译通过的。什么?很简单,加入编译器将swap这个宏替换为最终的代码,那么,就是这样:
if (