c ++预处理器指令函数

时间:2017-04-29 21:21:20

标签: c++ macros c-preprocessor

我有以下c ++代码:

#include <iostream>
#define func(x) (x*x)-x
using namespace std;

int main(void) {
int i = 3;
cout << func(i+2) << endl;
}

为什么func(i + 2)返回10?它不应该返回func(5)=(5 * 5) - 5 = 20?

5 个答案:

答案 0 :(得分:3)

表达式i+2以词汇方式插入到宏的占位符x中。 因此func(i+2)被翻译为(i+2*i+2)-i+2;使用i==3,这是(3 + 2*3 + 2) - 3 + 2并产生10

在宏中,使用宏参数时总是使用(...),即写

#define func(x) ((x)*(x))-(x)

代替。

而且,正如尼尔指出的那样,避免使用宏;而是使用函数。函数不易出错,可以调试,通常不会对性能产生负面影响:

int func(int x) { return x*x - x; }

答案 1 :(得分:2)

宏执行简单的文本替换。

所以

func(i+2) -> (i+2*i+2)-i+2 = (3+2*3+2)-3+2 = 3 + 6 + 2 - 3 + 2 = 10

也许你想要的是

#define func(x) ((x) * (x)) - (x)

答案 2 :(得分:2)

预处理转为

0

cout << func(i+2) << endl;

然后将其解析为

cout << (i+2*i+2)-i+2 << endl;

答案 3 :(得分:2)

func不是一个函数,它是一个宏。

func(i+2)扩展为(i+2*i+2)-i+2。二进制*运算符的优先级高于二进制+运算符,因此它被评估为(i + (2*i) + 2) - i + 2)。给定i = 3,得到(3 + (2*3) + 2) - 3 + 2,其评估为10。

这就是为什么你应该尽可能避免使用类似函数的宏,并且在你必须使用它们时应该始终采取预防措施来防止不正确的分组或参数的多次评估。

答案 4 :(得分:1)

因为宏功能提取如下:

(i + 2 * i + 2 ) - i + 2 

如果您为i = 3计算此值,则为10

宏功能不是真正的功能,它们只是为您替换文本。

所以,

cout << func(i+2) << endl;

替换为:

cout << (i + 2 * i + 2 ) - i + 2 << endl;