第六章预处理

在编程中,为了方便,有的时候我们会使用宏定义,首先,我们要明确一点,宏定义与函数式不同的,宏定义的功能就是替换,在编译时替换掉代码里面的使用宏的地方。

如求两个数中大的一个:

#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型指针




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值