c++中的宏处理器
Macroprocessor in c++
大家好,我对这个代码有疑问
#include<iostream>
#define SQR(x)(x*x)
int main() {
int a, b=3;
a = SQR(b+1);
std::cout << a;
}
结果是7而不是16。我不明白。
宏扩展为文字
(b + 1 * b + 1)
所以你的结果是:
3 + (1 * 3) + 1.
将宏更改为:
#define SQR(x)((x)*(x))
它应该起作用。
替换宏后,代码如下所示:
int main() {
int a, b=3;
a = b+1*b+1;
std::cout << a;
}
与具有运算符优先级的b+(1*b)+1
相同。你可以通过使用一个函数来修复它:
inline int SQR(int x) {
return x*x;
}
或者更一般地说:
template<class T> inline T SQR(T x) {
return x*x;
}
或者将宏参数括在括号中:
#define SQR(x) ((x)*(x))
这将扩展到((b+1)*(b+1))
。但是,一般来说,我不建议为此使用宏,因为还有其他潜在的问题,例如SQR(x++)
扩展到((x++)*(x++))
。
这就是您的代码扩展到的内容:
a = (b + 1 * b + 1)
由于*
比+
具有更高的优先级,因此首先评估1 * b
。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 预处理器:插入结构名称中的前一个行号
- 如何在c++中实现处理器调度模拟器
- C/C++预处理器是否可以检测一些编译器选项
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 在clang++预处理器中确定gcc工具链版本
- 不同/较旧的处理器运行c++代码的方式是否不同
- 用于交叉编译和CMake的预处理器宏的单元测试
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 如何比较两个同名的预处理器宏?
- 从预处理器获取 Windows 版本(C++ Win32)
- 如何摆脱为条件编译定义预处理器宏的需要?
- C 预处理器 - 现有定义的预置路径
- VS2015 预处理器定义与点
- 不带预处理器的调用方法/文件的文件名/行号
- 获取文件数据预处理器宏
- 有没有办法在 c++ 中拥有条件预处理器
- 如何在编译时定义C++预处理器指令的值?
- 修复"-Wunused-parameter"取决于预处理器条件的警告
- 如何确定我的处理器有多少个 AVX 寄存器?