41

我最近补充说:

#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我的其他文件,但失败了。线索是什么?

在问之前我环顾四周,但我不明白答案在 Visual C++ 上 NOMINMAX 可能存在的问题

4

4 回答 4

96

如果您真的很绝望,请在函数名称周围加上括号:

(std::min)(x, y);

此语法不会应用类似函数的宏。(正式地,要应用类似函数的宏,宏的名称必须后跟可选的空格,然后是'('。)

于 2012-11-16T16:45:34.517 回答
34

NOMINMAX通过编译器标志定义:

> cl.exe -DNOMINMAX ...

这将为所有源文件定义。我不使用 IDE,但此页面提供了有关导航 IDE 以进行设置的指南:Using STL in Windows Program Can Cause Min/Max Conflicts

只需定义 NOMINMAX 预处理器符号。这可以在 Developer Studio 项目中的 Build、Settings 下的 C/C++ 选项卡的 Preprocessor 类别中完成。这将抑制 Windef.h 中的最小和最大定义。

于 2012-11-16T12:22:14.460 回答
14

如果您定义 NOMINMAX,因为您更喜欢 STL 版本,那么在包含使用 min/max 宏的 gdiplus.h 时可能会遇到问题。作为解决方案,您需要在包含 gdiplus.h之前包含 STL 标头并使用“使用命名空间 std”。

例如:

#define NOMINMAX

// Include C++ headers
#include <algorithm>
using namespace std;

// Include Windows headers
#include <windows.h>
#include <gdiplus.h>
于 2014-12-17T09:28:04.370 回答
7

很可能你的问题是你#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告诉编译器(或实际上是预处理器)跳过 and 的定义也是min如此,max但它仅适用于你在你之前执行它的情况#include "windows.h"

于 2014-08-18T04:11:50.423 回答