宏和函数

此为C语言的基础,和Linux内核关系并不大,不过还是作为补充知识点介绍一下好了。宏非常频繁的用于执行简单的计算,比如在两个表达式中寻找其中较大的一个:

#define MAX(a,b) ((a)>(b)?(a):(b))

如果使用函数来实现的话就比较慢,宏的话在编译的时候就完成工作,所以使用宏远比使用函数调用效率来的可观。和使用函数相比,使用宏的不利之处就在于每次使用宏的时候,一个宏定义代码的拷贝就插入到程序中,这样会增加程序的长度。除非非常的短,否则使用宏可能大幅增加程序的长度。

1.宏的副作用,就拿上面MAX举例

#define MAX(a,b) ((a)>(b)?(a):(b))
int x=5;
int y=8;
int z=MAX(x++,y++)
printf("%d %d %d\n",x,y,z);

输出结果是:6,10,9

和往常一样,只要检查一下宏替换代码如下:

z=((x++)>(y++)?(x++):(y++));较大的数会增加两次哎!


2.#define需要注意的地方

  • #define name stuff

如果stuff比较长,每行的末尾要加上\。

#define DEBUG_PRINT printf("string:%s,"\
						"x=%d,y=%d,z=%d",\
						"hello",x,y,z)
int main()
{
	int x=1,y=2,z=3;
	DEBUG_PRINT;
	return 0;
}

我们利用了相邻的字符串会自动连接为一个字符串的特性。

  • #define name(param-list) stuff
比如#define SQUARE(x) x*x
这里有个问题:a=5,SQUARE(a+1)就有问题。乍一看没啥问题,觉着会输出36,但是结果却是11.想知道为什么?宏替换如下:a+1*a+1=11。解决方法就是给宏加上括号
#define SQUARE(x) (x)*(x)
我们再看另外一种情况
#define DOUBLE(x) (x)+x(x)
10*DOUBLE(2)得到多少?本来我们想得到的结果是:40,但是实际结果却是22
所以改为:#define DOUBLE(x) ((x)+(x))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值