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.

    顺序 选择 循环 总结

  • 相关阅读:
    PowerTalk第一个版本儿控件
    PowerTalk第二个版本,支持(Msn回复信息)
    自然语言处理著作或期刊名称
    自然语言处理(NLP)网上资源整理 (转)
    TFIDF
    计算机科学及工程
    自然语言处理与计算语言学书籍汇总之一:国外书籍
    UVa 10696 f91
    缓存
    操作必须使用一个可更新的查询(转)
  • 原文地址:https://www.cnblogs.com/Braveliu/p/7161118.html
Copyright © 2011-2022 走看看