2011-02-06 21 views
28

私のプログラムの中で他に先にNOMINMAXを定義するとどんな問題が起こるでしょうか?Visual C++のNOMINMAXで起こりうる問題

私が知る限り、<Windows.h>minmaxというマクロを定義していないので、多くの場合STLと競合します。 std::min(),std::max()またはstd::numeric_limits<T>::min()が解決されました。

Windows固有のコードと従来のコードのみが問題を抱えていることを前提にしていますか? ほとんどすべてのライブラリは、min()max()にマクロとして定義されるべきではありませんか?

編集:他のWindowsヘッダーに問題はありますか?

+1

ありさえWindows固有のコードで、問題があることが、それは可能ですべきではありません動作しないコードがいくつか存在することを示します。あなたはそれを試してみて、何かエラーがあるのを見てみませんか? –

+0

私たちの内部コードでは、 'NOMINMAX'がうまくいきます。しかし、このライブラリは外部の開発者によっても使用されており、私はそのアプリケーションを壊すことは望んでいません。 – Manuel

+1

'#define'はコンパイル時の操作です。ライブラリはリンクされており、コンパイルされていません。つまり、独自の '#define'を持つことができます。ライブラリユーザーは '#define'd' NOMINMAX'を見ません。 – MSalters

答えて

47

NOMINMAXを使用することは、<windows.h>を含める完全に悪い方法ではありません。 UNICODESTRICTも定義する必要があります。後者は現代の実装ではデフォルトで定義されていますが。

ただし、Microsoft ’のヘッダーで問題が発生する可能性があります。 GdiPlusの場合I ’他の企業や人物のヘッダーに関する問題は認識していません。

のGdiPlusがないように、ヘッダは、名前空間を定義している場合、片方の修正を使用して、<algorithm>を含む関連ヘッダ、のラッパーを作成し、ヘッダ’の名前空間、using namespace std;(あるいはusing std::min;using std::max)内側:それはを行うべきではありませんヘッダー内のグローバルスコープ、でusing namespace std;とは非常に異なっていること

#define NOMINMAX 
#include <algorithm> 
namespace Gdiplus 
{ 
    using std::min; 
    using std::max; 
} 

注意。

ドン’ネームスペースがない場合の良い回避策を知っていますが、うれしくも私は’を実行していませんので、実際にはその特定の問題はおそらく疑問です。

+1

GdiPlusの場合、問題は回避できますか? – Manuel

+1

@Manuel:はい、明らかに。私は自分のやったことをうまく機能するが、私が行使していない邪悪なGdiPlusコードがないことを保証することはできないので、 "明らかに"という言葉で修飾語を含める必要がある。どこか。 –

+0

もう一つの解決策は、STLの 'min'、' max'のgo_をちょうど_letleし、コンパイラにあなたのGDIPlusプロジェクトにWindef.hの 'min'、' max'を使用させることです。大したことではありません。 – bobobobo

11

Iは、一般的に潜在的な副作用を制限するために、このようなNOMINMAXを使用する:

#define NOMINMAX 
#include <windows.h> 
#undef NOMINMAX 

NOMINMAXの範囲が比較的限定されている方法を。

これは完璧な解決策ではありません。他の何かが既にNOMINMAXを定義している場合、このパターンは失敗します(私はそのようなケースに遭遇したことはありません)。

本当に慎重にしたいのであれば、windows.hを#includeした場所にラッパーヘッダーを#includeできます。あなたがUNICODEおよび/またはSTRICTを強制するように、あまりにも、ラッパーで他のことをやって想像

/* Include this file instead of including <windows.h> directly. */ 
#ifdef NOMINMAX 
#include <windows.h> 
#else 
#define NOMINMAX 
#include <windows.h> 
#undef NOMINMAX 
#endif 

:ラッパーはこのような何かを行くだろう。

0

プリコンパイル済みヘッダー(stdafxなど)。H)私はこれを使用します。

#define NOMINMAX 
#include <algorithm> 
#include <Windows.h> 
#ifndef min 
#define min(x,y) ((x) < (y) ? (x) : (y)) 
#endif 
#ifndef max 
#define max(x,y) ((x) > (y) ? (x) : (y)) 
#endif 
#include <gdiplus.h> 
#undef min 
#undef max 
0

私は次の順序でヘッダと名前空間を宣言することによって、問題を修正しまっ:

#include <windows.h> 
#include <minmax.h> 
#include <gdiplus.h> 

using namespace Gdiplus; 
using namespace std; 
関連する問題