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

新手上路,请多包涵
#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 : '::'

原文由 hidayat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

The windows.h header file (or more correctly, windef.h that it includes in turn) has macros for min and max which are interfering.

在包含它之前,您应该 #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 两次,这不是您可能期望的。

我现在基本上只将宏用于条件编译,其他两个旧的主要用例(符号常量和类似函数的宏)可以通过更现代的语言特性(真正的枚举类型和内联函数建议)更好地处理。

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 4.0 许可协议

为了解决这个问题,我只创建了名为 fix_minmax.h 的头文件 ,没有 包含保护

#ifdef max
    #undef max
#endif

#ifdef min
    #undef min
#endif

#ifdef MAX
    #undef MAX
#endif
#define MAX max

#ifdef MIN
   #undef MIN
#endif
#define MIN min

#include <algorithm>
using std::max;
using std::min;

基本用法是这样的。

 // Annoying third party header with min/max macros
#include "microsoft-mega-api.h"
#include "fix_minmax.h"

这种方法的优点是它适用于所有类型的包含文件或部分代码。在处理依赖于 min / max 宏的代码或库时,这也可以节省您的时间

原文由 Inline 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题