c++ - 为什么包含 windows.h 时 std::min 失败?

标签 c++ visual-studio-2005

#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/

相关文章:

c++ - 为什么 C++ 是中级语言?

debugging - 使用firefox和visual studio.net调试asp.net-与IE相比非常慢

visual-studio-2005 - MFC:为什么我的旋转控制向后工作

c++ - 从 Visual Studio 2005 升级到 Visual Studio 2008 的陷阱

visual-studio-2005 - DataGridView:滚动条不刷新

c++ - 调用Qpainter的paint方法刷新图片,改变颜色

c++ - Qt中的多重继承

c++ - 是否有相当于 _aligned_realloc 的 linux

c++ - 从 Visual Studio 2005 移植到 2008 或更高版本

c++ - 修改发送 DBT_DEVICEREMOVECOMPLETE 之前的时间