C++ 预处理器指令函数

c++ preprocessor directive function

本文关键字:函数 指令 处理器 预处理 C++      更新时间:2023-10-16

我有以下 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 吗?

表达式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)

相反。

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

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

宏做一个简单的文本替换。

所以

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)

预处理转弯

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

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

然后解析为

cout << (i + (2*i) + 2) - i + 2 << endl;
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。

这就是为什么您应该尽可能避免使用类似函数的宏,并且应该始终采取预防措施,以防止在必须使用参数时出现不正确的分组或参数的多次计算等情况。

因为宏函数的提取方式如下:

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

如果以i = 3计算,则为10

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

所以

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

替换为:

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