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

问题描述 投票:98回答:10
#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 : '::'
c++ visual-studio-2005
10个回答
141
投票

windows.h头文件(或更正确的是,它依次包含的windef.h具有干扰的minmax的宏。

您应该在包含#define NOMINMAX之前将其添加。


0
投票

要解决此问题,我只创建了名为fix_minmax.h的头文件


76
投票

无需定义任何内容,只需使用以下语法绕过宏:

(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);

25
投票

正如其他人提到的,该错误是由于Windows标头中定义的最小/最大宏引起的。有三种禁用它们的方法。

1] #define NOMINMAX在包含头之前,通常这是定义宏以影响以下头的糟糕技术;

2)在编译器命令行/ IDE中定义NOMINMAX。这个决定的坏处在于,如果您想运送自己的货源,则需要警告用户也要这样做;

3)在使用它们之前,只需在代码中取消定义宏

#undef min
#undef max

这可能是最便携式和灵活的解决方案。


17
投票

我有时仍然会遇到Windows标头的麻烦,并且NOMINMAX的项目范围的定义似乎并不总是有效。作为使用括号的替代方法,有时我会像这样使类型显式:

int k = std::min<int>(3, 4);

这也将阻止预处理器与min匹配,并且可以说比括号解决方法更具可读性。


15
投票

尝试这样的事情:

#define NOMINMAX
#include <windows.h>

默认情况下,windows.h将minmax定义为宏。展开这些代码后,尝试使用std::min的代码将最终看起来像这样:

int k = std::(x) < (y) ? (x) : (y);

错误消息告诉您不允许使用std::(x)


4
投票

在我的情况下,项目未明确包含windows.hwindef.h。它正在使用Boost。因此,我通过转到项目Properties -> C/C++ -> Preprocessor,并在NOMINMAX中添加Preprocessor Definitions(VS 2013,VS 2015)解决了该问题。


2
投票
#define NOMINMAX

2
投票

对于包括windows.h的人,在有效的标题中放入以下内容:


1
投票

我假设windows.h确实将min定义为宏,例如等

© www.soinside.com 2019 - 2024. All rights reserved.