C语言-函数式宏

函数式宏

函数式宏(function-like macro)较之对象式宏可以进行更复杂的代换。

#define sqr(x) ((x) * (x))    

函数和函数式宏

函数式宏sqr是在编译时展开并填入程序的,因此只要是能用双目运算符*进行乘法计算的数据类型,都能使用函数式宏

函数定义则需为每个形参都定义各自的数据类型,返回值的类型也只能为一种。就这点而言,函数较为严格。

函数为我们默默无闻地进行了一些复杂处理,如:

  • 参数传递(将实参的值复制到形参)
  • 函数调用和函数返回操作(程序流程的控制)
  • 返回值的传递

而函数式宏所做的工作只是宏展开和填入程序,并不进行上述处理。

根据以上特征,函数式宏或许能使程序的运行速度稍微提高一点,但是程序自身却有可能变得臃肿

函数式宏在使用上必须小心谨慎。例如,sqr(a++)展开后((a++) * (a++))。每次展开,a的值都会自增两次。在不经意间表达式被执行了两次,导致程序出现预料之外的结果,我们称这种情况为宏的副作用(side effect)

在定义和使用函数式宏时,请仔细考虑是否会产生副作用。

函数版的sqr_int(a++)a的值不会递增两次,如果是宏版,则要将sqr(a)a++分开。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 中国人一直很讲究一个“度”,常说的过犹不及就是这个意思,多了少了都不好。所以说万事须讲“度”,率性而为不可取,急于...
    晴云秋月AL阅读 353评论 0 1
  • 燕赵北魏的佩枪侠士站在烈烈风里 手持半壶女儿陈酿 眼望年轻的响马禹禹前行 桀骜不驯的眼里带刀 一如旧时的自己
    野马阿姨阅读 651评论 2 3
  • 一个平常的周六。 很喜欢今天的雨,和以往的时候不同,今天的雨淅淅沥沥地下了很久,一般这里的雨是很难停留很长时间的,...
    若荷_阅读 243评论 0 0
  • 【眼儿媚·其一】缘结相逢在当初。弯月映明珠。一汪情目,两叶青黛,白雪肌肤。无端便把相思引,夜夜对君书。料来也是,朱...
    曾慕青衫阅读 387评论 0 12
  • 电影里面的蜘蛛人是一个具有超强的力量,能够粘附在大部分物体表面,并能够发射出蜘蛛丝来抵抗坏人的超级英雄。其实,现实...
    aicoffe阅读 383评论 0 0

友情链接更多精彩内容