在编程中,为了方便,有的时候我们会使用宏定义,首先,我们要明确一点,宏定义与函数式不同的,宏定义的功能就是替换,在编译时替换掉代码里面的使用宏的地方。
如求两个数中大的一个:
#define max(x,y) ((x) > (y) ? (x) : (y))
在使用宏定义时间,我们要注意几点:
1.定义时中间不能有空格,如:
#define f (x) ((x) * (x))
代码的原意是定义这样一个替换f(x) = x * x; 但是,在这里的效果是f被 (x) ((x) * (x))这样一个整体替换了,显然不对了。
宏定义在定义时中间不要有多余的空格,在使用的时候没关系,如:
#define f(x) ((x) * (x))
使用时:f (1);等价于f(1);
2.进行宏定义时,在一些地方要加上括号,
#define abs(a) a > 0 ? a : -a
printf("%d\n", abs(2)+1);//结果为2
替换后的结果:2 > 0 ? 2 : -2 + 1 ,显然不对;
3.可能出现重复计算的情况:一方面会使得效率低下,另一方面,有可能出错;
int a[10] = {2, 3, 1}, big = 0, i = 1, n = 4;
while(i < n)
{
big = max(big, a[i++]);
printf("%d\n", i);
}
运行结果如下:不是2,3,4,这里就是因为,a[i++]在用max()替换后被重复计算了,导致出错了。
4.宏定义与typedef的一些异同:
相同之处:定义单个变量
#define F int
typedef int G;
F a;
G b;
不同之处:定义多个变量
#define FF int*
typedef int* GG;
FF a, b;//这里a是int型指针,b是int型整数
GG c, d;//这里c和d都是int型指针