宏定义的参数为什么会有副作用

《C语言参考手册(原书第5版)》第3章C预处理器,C预处理器是一种简单的宏处理器。从概念上说,它在编译器读取源程序之前对C程序的源文本进行处理。在C的有些实现中,预处理器实际上是一个独立的程序。它读取最初的源文件,并写入到一个新的“经过预处理”的源文件,后者可以作为C编译器的输入。本节为大家介绍宏参数的副作用。

AD: 51CTO云计算架构师峰会 抢票进行中!

3.3.7   宏参数的副作用

宏也可能因为副作用而产生问题。由于宏的实际参数可能会被文本复制,它们的执行次数可能不止一次,因此实际参数的副作用可能会产生不止一次。反之,与宏调用看上去很相似的真正函数调用对实参表达式的求值次数正好只有一次,因此表达式的副作用也正好出现一次。为了避免这种问题,在使用宏时必须小心。

例子

考虑前一个例子的SQUARE宏以及(几乎)完成相同任务的square函数:

 
这个宏可以求浮点数的平方根,而这个函数只能求整数的平方根。另外,调用函数的运行速度要稍慢于调用宏。但是,和可能产生的副作用相比,这些差别是微不足道的。在下面的程序片段中:
 
变量b获得的值是9,而变量a的最终值是4。但是,在下面这个表面看上去相似的程序片段中:
 
变量b值可能是12,变量a的最终值可能是5,这是因为后面这个程序片段被展开为:
 

(12和5可能是b和a的最终值,这是因为标准C编译器可能以不同的方式对表达式((a++)*(a++)进行求值。参见第7.12节。)

参考:增值操作符++ 第7.4.4节。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值