std :: min给出错误

#include <algorithm> #include <Windows.h> int main() { int k = std::min(3, 4); return 0; } 

什么是Windows在做什么,如果我包括Windows.h我不能在Visual Studio 2005中使用std :: min。错误消息是:

 error C2589: '(' : illegal token on right side of '::' error C2059: syntax error : '::' 

windows.h头文件(或更正确地windef.h ,它包含windef.h )具有minmax的干扰的macros。

包括它之前你应该#define NOMINMAX

不需要定义任何东西,只需使用以下语法绕过macros:

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

正如其他人提到的,这些错误是由于在Windows头文件中定义的最小/最大macros。 有三种方法禁用它们。

1)在包含头文件之前#define NOMINMAX ,这通常是定义macros以影响以下头文件的一种不好的技术;

2)在编译器命令行/ IDE中定义NOMINMAX 。 这个决定的不好之处在于,如果你想发布你的源代码,你需要警告用户也这样做。

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

 #undef min #undef max 

这可能是最便携和灵活的解决scheme。

尝试这样的事情:

 #define NOMINMAX #include <windows.h> 

默认情况下,windows.h将minmax定义为macros。 当这些扩展时,试图使用std::min (例如)的代码最终会看起来像这样:

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

错误消息告诉你std::(x)是不允许的。

我偶尔还是遇到了windows头文件,而且项目的NOMINMAX定义并不总是有效。 作为使用圆括号的替代方法,我有时会使types如下所示:

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

这也阻止了预处理器匹配min ,可以说是比括号解决方法更可读。

在我的情况下,项目没有明确包含windows.hwindef.h 。 它使用了Boost。 所以,我通过转到项目Properties -> C/C++ -> Preprocessor ,并在Preprocessor Definitions (VS 2013,VS 2015)中附加了NOMINMAX来解决了这个问题。

我假设windows.h确定min是一个macros,例如

 #define min(a,b) ((a < b) ? a : b) 

这将解释错误消息。

 #define NOMINMAX 

是抑制max和min的macros定义的技巧

http://support.microsoft.com/kb/143208

对于包括windows.h在内的人来说,将下列内容放在受影响的头文件

 #include windows headers ... pragma push_macro("min") pragma push_macro("max") #undef min #undef max #include headers expecting std::min/std::max ... ... pragma pop_macro("min") pragma pop_macro("max") 

在源文件中只有#undef最小和最大。

 #include windows headers ... #undef min #undef max #include headers expecting std::min/std::max ... 

以下为我工作。

 using namespace std; int k = min(3, 4);