C++ 代码无法选取声明的宏
在下面的代码中,输出值与宏中的定义不同,这是因为这些值必须在预处理器阶段之前可用吗C++ 代码无法选取声明的宏,c++,c,macros,C++,C,Macros,在下面的代码中,输出值与宏中的定义不同,这是因为这些值必须在预处理器阶段之前可用吗 #define INT_MAX 100 #include <iostream> using namespace std; int main() { int x = INT_MAX; x++; cout<<x<<INT_MAX; } #定义整数最大值100 #包括 使用名称空间std; int main() { int x=int_MAX; x++
#define INT_MAX 100
#include <iostream>
using namespace std;
int main()
{
int x = INT_MAX;
x++;
cout<<x<<INT_MAX;
}
#定义整数最大值100
#包括
使用名称空间std;
int main()
{
int x=int_MAX;
x++;
cout在limits.h
中定义了一个名为INT\u MAX
的宏。我假设iostream
包括limits.h
并覆盖您自己对INT\u MAX
的定义。
这会在x++
处导致整数溢出,因为INT\u MAX
是可以用整数表示的最大值。发生的事情是,在您自己定义INT\u MAX之后,您包括了iostream。这会引入限制。h,它将INT\u MAX重新定义为最大可用32位INT-请参阅。递增具有最大值的int是未定义的,但在大多数CPU体系结构/编译器组合中,它会返回到可能的最小int值
根据编译器警告级别的不同,您应该会收到一条关于重新定义INT_MAX的警告。如果在include语句后将其定义为100,则应该得到101
重新定义标准库提供的宏可能会导致混淆,因此我建议您为宏选择不同的名称。等等。谁说它未定义?错误消息在哪里?您正在测试当您增加超过INT\u MAX
时会发生什么。这与它是一个宏无关。您使用的编译器是什么?是的,我尝试在include语句之后定义它,现在它的工作正常。肯定会覆盖原始值。不是吗?如果我的其他开发人员在这个项目中使用相同的宏,如果他们不知道这个定义,这也会破坏代码。是的。这就是为什么我编辑了添加的答案“重新定义标准库提供的宏往往会导致混淆,因此我建议您为宏选择不同的名称。”“如预期”并不完全正确,因为溢出已签名的int是错误的