zoukankan      html  css  js  c++  java
  • 宏和函数的区别(一个BUG的总结)

    【1】BUG简单示例代码

    主要代码如下:

     1 #include <QCoreApplication>
     2 #include <QDebug>
     3 
     4 #define ADD(a, b, c) ((a) + (b) + (c))
     5 
     6 int func(int &n)
     7 {
     8     n += 100;
     9     return 1;
    10 }
    11 
    12 int addFunc(int a, int b, int c)
    13 {
    14     return (a + b + c);
    15 }
    16 
    17 int main(int argc, char *argv[])
    18 {
    19     QCoreApplication a(argc, argv);
    20 
    21     // begin main procedure
    22     int a1 = 10;
    23     qDebug() << "macro result :: " << ADD(func(a1), a1 + 10, a1);
    24     qDebug() << "macro expanse result :: " << ((1) + (10 + 10) + (10));
    25     int a2 = 10;
    26     qDebug() << "function result :: " << addFunc(func(a2), a2 + 10, a2);
    27     // end main procedure
    28 
    29     return a.exec();
    30 }
    31 
    32 // run out:
    33 /*
    34 macro result ::  231
    35 macro expanse result ::  31
    36 function result ::  31
    37 */

    注意:宏、宏展开、函数调用的结果差异。

    用宏计算时,宏中的参数由前至后赋值。

    逐步分析:调用func(a1),调用结束后,宏的第一个参数值为1(即函数返回值),同时由于func为引用形参,a1此时值为110;

    宏的第二个参数值为a1 + 10 = 120;宏的第三个参数值为a1 = 110。最后,宏计算值为231(1 + 120 + 110)

    假如把宏展开,第一个参数值为1;第二个参数值为10 + 10 = 20;第三个参数值为10;所以结果为31(1 + 20 + 10)

    用函数计算,调用函数时,参数压栈由后向前。

    逐步分析:函数第三个参数值为a2 = 10;第二个参数值为a2 + 10 = 20;

    第一个参数值为函数返回值1,尽管函数调用结束后a2值为110,但参数二、三已压栈赋值完成。

    【2】使用宏和函数的区别

    使用宏,宏中的参数由前至后。

    使用函数,函数调用时,参数压栈顺序由后向前。

    更多关于宏的资料,请参见《宏定义学习

    Good Good Study, Day Day Up.

    顺序 选择 循环 总结

  • 相关阅读:
    PHP之防御sql注入攻击的方式
    分享Java开发的利器-Lombok
    Linux最佳的云存储服务分析
    提升PHP编程效率的20个要素
    Java中常见的URL问题及解决方案
    配置CNPM-基础案例
    微软Skype Linux客户端全新发布
    jQuery 3.0最终版发布,十大新特性眼前一亮
    【风马一族_mysql】MySQL免安装版环境配置图文教程
    【风马一族_物理】维度空间的粒子
  • 原文地址:https://www.cnblogs.com/Braveliu/p/7161118.html
Copyright © 2011-2022 走看看