C语言-函数式宏

作者: Jimmy_L_Wang | 来源:发表于2018-09-27 09:33 被阅读1次

函数式宏

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

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

函数和函数式宏

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

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

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

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

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

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

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

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

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

相关文章

  • C语言-函数式宏

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

  • scanf函数

    scanf函数 一、是什么? C语言下的scanf()函数是样式化输入函数,也称为阻塞式函数,有C语言自带的库提供...

  • 三、inline内联函数

    C语言中有宏函数的概念。宏函数的特点是内嵌到调用代码中去,避免了函数调用的开销。但是由于宏函数的处理发生在预处理阶...

  • [初学C++]C++的拓展--inline内联函数

    C语言中有宏函数的概念。宏函数的特点是内嵌到调用代码中去,避免了函数调用的开销。但是由于宏函数的处理发生在预处理阶...

  • 5-C中的函数

    可以说C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函数式语言.C源程序是由函数组成的。 函数分类...

  • NS_INLINE 内联函数

    1 内联函数与宏定义 C++ 语言支持函数内联,其目的是为了提高函数的执行效率(速度)。在C程序中,可以用宏代码提...

  • C++内联函数与C语言函数宏

    C++内联函数 什么是内联函数? 在函数的声明和定义前加一个 inline 关键字,这个函数就是内联函数。 通常会...

  • 基础C语言知识串串香11☞宏定义与预处理、函数和函数库

    六、C语言宏定义与预处理、函数和函数库 6.1、编译工具链 源码.c->(预处理)->预处理过的.i文件->(编译...

  • C语言笔记

    1. C语言本质上属于函数式语言,分为系统定义库函数和用户自定义函数两类。 常用库函数:scanf,printf,...

  • Xcode 编译C语言文件

    Xcode编译C语言的宏函数的时候会报Expected identifier or '('的错误,这时候只要把空的...

网友评论

    本文标题:C语言-函数式宏

    本文链接:https://www.haomeiwen.com/subject/zewsoftx.html