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语言-函数式宏

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