C++ 预处理器指令函数
c++ preprocessor directive function
我有以下 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;
相关文章:
- 函数名是c中该函数的第一条指令的地址吗
- 防止编译器分离函数的指令
- 在命名空间中使用指令和函数重载
- 稍后在构造函数中重新启动异常指令删除此指令
- 为什么 using 指令不能与普通函数"associate"?
- C++ 预处理器指令函数
- 递归函数中的 GOTO 指令
- 将指令与模板化成员函数一起使用
- 使库函数模板化以避免编译器指令是否有益?
- 我如何在燃料中读取指令,然后使用来自Infile的参数将函数形状写入外档
- LLVM:更改函数中的指令或基本块
- 包装内部函数的简单C++表达式模板会产生不同的指令
- 在仅包含字节而不是指令名称的函数中使用 ASM
- 如何使用调用和别名指令在 llvm 字节码中查找函数名称
- 我可以在函数作用域中使用定义指令吗?
- "using"指令如何使用模板成员函数
- 通过内部函数或指令手动控制英特尔 MIC SIMD 操作
- 在本地将 'using std::foo' 指令应用于构造函数初始值设定项列表 (C++)
- 为什么sleep in函数忽略了程序中的几个顺序指令
- 如何使用 Bison %析构函数指令