我最近补充说:
#define NOMINMAX
#include <Windows.h>
#include <algorithm>
到我的main.cpp以便使用
std::max( x , x ); // x is just a placeholder and not actual anything
std::min( x , x );
但我无法在其他文件中使用std::max()/std::min()
。
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
我尝试在其他文件中添加#define NOMINMAX
,但失败了。什么是线索?
答案 0 :(得分:69)
如果你真的很绝望,请在功能名称周围添加括号:
(std::min)(x, y);
此语法不会应用类似函数的宏。 (形式上,要应用类似函数的宏,宏的名称必须后跟可选的空格,然后是'('。)
答案 1 :(得分:22)
通过编译器标志定义NOMINMAX
:
> cl.exe -DNOMINMAX ...
然后将为所有源文件定义。我不使用IDE,但此页面提供了有关导航IDE以设置此指南的指导:Using STL in Windows Program Can Cause Min/Max Conflicts :
只需定义NOMINMAX预处理器符号即可。这可以在“构建”,“设置”下的“开发人员工作室”项目中,在“预处理器”类别的“C / C ++”选项卡上完成。这将抑制Windef.h中的最小和最大定义。
答案 2 :(得分:5)
您#define NOMINMAX
之后的问题可能就是#include "windows.h"
。 #define
首先是重要的。
原因是windows.h(实际上我认为windef.h,包含在windows.h中)的代码与此类似:
#ifndef NOMINMAX
#define min(x,y) ((x) < (y) ? (x) : (y))
#define max(x,y) ((x) > (y) ? (x) : (y))
#endif
所以#define NOMINMAX
告诉编译器(或实际上是预处理器)跳过min
和max
的定义,但它只适用于#include "windows.h"
和{{1}}的定义{{1}} 1}}。
答案 3 :(得分:5)
如果您定义NOMINMAX,因为您更喜欢STL版本,那么在包含使用min / max宏的gdiplus.h时可能会遇到问题。 作为解决方案,您需要包含STL标头并使用“using namespace std”之前包含gdiplus.h。
例如:
#define NOMINMAX
// Include C++ headers
#include <algorithm>
using namespace std;
// Include Windows headers
#include <windows.h>
#include <gdiplus.h>