宏和函数的区别(一个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.
顺序 选择 循环 总结