#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
如果我包含 Windows.h,Windows 会做什么?我无法在 Visual Studio 2005 中使用 std::min
。错误消息是:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
最佳答案
windows.h
头文件(或更准确地说,它依次包含的 windef.h
)具有用于 min
的宏和 max
干扰。
你应该 #define NOMINMAX
在包含它之前。
事实上,即使没有冲突,你也应该这样做,因为宏的天真定义说明了为什么类函数宏是一个坏主意:
#define max(a,b) ((a)>(b)?(a):(b))
如果您调用该宏,例如:
int x = 5, y = 10;
int c = max(x++, y--);
然后 y
不会以您的期望结束。例如,它将扩展为:
int c = ((x++)>(y--)?(x++):(y--));
该表达式(除非出现未定义的行为会更糟)将递减 y
两次,这不是您所期望的。
我现在基本上只将宏用于条件编译,其他两个旧的主要用例(符号常量和类似函数的宏)通过更现代的语言特性(真正的枚举类型和内联函数建议)更好地处理。
关于c++ - 为什么包含 windows.h 时 std::min 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5004858/