#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 : '::'
答案 0 :(得分:138)
windows.h
标头文件(或更准确地说,它依次包含windef.h
)具有min
和max
的干扰宏。
在加入之前你应该#define NOMINMAX
。
答案 1 :(得分:72)
无需定义任何内容,只需使用以下语法绕过宏:
(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);
答案 2 :(得分:22)
正如其他人所提到的,错误是由于在windows标题中定义的最小/最大宏造成的。有三种方法可以禁用它们。
1)#define NOMINMAX
在包含标题之前,这通常是定义宏以便影响以下标题的错误技巧;
2)在编译器命令行/ IDE中定义NOMINMAX
。关于这个决定的不好的部分是,如果你想发货,你需要警告用户也这样做;
3)在使用代码之前简单地取消定义代码中的宏
#undef min
#undef max
这可能是最便携,最灵活的解决方案。
答案 3 :(得分:16)
我偶尔会遇到有关Windows标题的麻烦,而NOMINMAX的项目范围定义似乎并不总是有用。作为使用括号的替代方法,我有时会将类型显式化为:
int k = std::min<int>(3, 4);
这也会阻止预处理器与min
匹配,并且可以说比括号变通方法更具可读性。
答案 4 :(得分:15)
尝试这样的事情:
#define NOMINMAX
#include <windows.h>
默认情况下,windows.h将min
和max
定义为宏。当这些扩展时,尝试使用std::min
的代码(例如)将最终看起来像这样:
int k = std::(x) < (y) ? (x) : (y);
错误消息告诉您不允许std::(x)
。
答案 5 :(得分:4)
就我而言,项目未明确包含windows.h
或windef.h
。它正在使用Boost。所以,我通过转到项目Properties -> C/C++ -> Preprocessor
并在NOMINMAX
(VS 2013,VS 2015)中附加 Preprocessor Definitions
来解决了这个问题。
答案 6 :(得分:2)
答案 7 :(得分:2)
对于包括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 min和max。
#include windows headers ...
#undef min
#undef max
#include headers expecting std::min/std::max ...
答案 8 :(得分:1)
我假设windows.h确实将min定义为宏,例如像
#define min(a,b) ((a < b) ? a : b)
这可以解释错误信息。
答案 9 :(得分:-1)
要解决此问题,我只需创建名为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
宏的代码或库的时间