宏和函数的区别(一个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.

顺序 选择 循环 总结

原文地址:https://www.cnblogs.com/Braveliu/p/7161118.html