web-dev-qa-db-ja.com

#std :: min / maxを使用してNOMINMAXを定義する

最近追加しました:

_#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で起こりうる問題

29
NaturalDemon

本当に必死なら、関数名を括弧で囲んでください:

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

この構文は、関数のようなマクロを適用しません。 (正式には、関数のようなマクロを適用するには、マクロの名前の後にオプションの空白文字と '('が続く必要があります。)

72
Pete Becker

コンパイラフラグを介してNOMINMAXを定義します。

> cl.exe -DNOMINMAX ...

これは、すべてのソースファイルに対して定義されます。私はIDEを使用しませんが、このページではIDEを設定してこれを設定するためのガイダンスを提供します: WindowsプログラムでSTLを使用すると最小/最大の競合が発生する

NOMINMAXプリプロセッサシンボルを定義するだけです。これは、Developer Studioプロジェクトの[ビルド]、[設定]、[C/C++]タブの[プリプロセッサ]カテゴリで実行できます。これにより、Windef.hの最小および最大の定義が抑制されます。

23
hmjd

STLバージョンを好むためにNOMINMAXを定義すると、min/maxマクロを使用するgdiplus.hをインクルードするときに問題が発生する可能性があります。解決策として、STLヘッダーを含め、「using namespace std」を使用する必要がありますbefore gdiplus.hを含めます。

例:

#define NOMINMAX

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

// Include Windows headers
#include <windows.h>
#include <gdiplus.h>
8
David Gausmann

問題はおそらく#define NOMINMAX お先にどうぞ #include "windows.h"#define 最初に来ます。

その理由は、windows.h(実際、windows.hに含まれるwindef.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"

5
Tom