本文最后更新于 68 天前,其中的信息可能已经有所发展或是发生改变。
在C++编程中,通过使用#define
宏来定义带有参数的函数时,编译器会在预处理阶段进行特定的替换。
这时候会有一个小坑。
例如以下代码:
#include <iostream>
using namespace std;
#define SQUARE(x) (x * x)
int main() {
cout << "SQUARE(5+3) 的值是:" << SQUARE(5+3) << endl;
return 0;
}
运行之后结果如下:
很明显,编程者原本期望的结果应该是8*8=64
才对。
来分析一下发生了什么,执行SQUARE( 5 + 3 )
时,实际上运行过程是( 5 + 3 * 5 + 3 )
,所以运行结果就是23
了。
所以说,使用#define定义函数时,在表达式中使用到函数的参数时,应该用括号把参数括起来,就像下面这样:
#include <iostream>
using namespace std;
#define SQUARE(x) ((x) * (x))
int main() {
cout << "SQUARE(5+3) 的值是:" << SQUARE(5+3) << endl;
return 0;
}
运行结果如下:
可以看到这样子程序就运行正确了。
此时运行过程中执行的就是(( 5 + 3 ) * ( 5 + 3 ))
,结果就是8*8=64
了。