web-dev-qa-db-ja.com

windows.hのmaxマクロをstdのmaxと衝突させるにはどうすればよいですか?

だから私はcinから有効な整数入力を取得しようとしていたので、これに対する答えを使用しました question

推奨:

#include <Windows.h> // includes WinDef.h which defines min() max()
#include <iostream>
using std::cin;
using std::cout;

void Foo()
{
    int delay = 0;
    do
    {
        if(cin.fail())
        {
            cin.clear();
            cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
        cout << "Enter number of seconds between submissions: ";
    } while(!(cin >> delay) || delay == 0);
}

これは、Windowsでmaxマクロがそれほど多くの引数をとらないというエラーを出します。これは私がこれをしなければならないことを意味します

do
{
    if(cin.fail())
    {
        cin.clear();
#undef max
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    cout << "Enter number of seconds between submissions: ";
} while(!(cin >> delay) || delay == 0);

動作させるため。それはかなりいです。この問題を回避するより良い方法はありますか? maxの定義を保存し、後で再定義する必要がありますか?

52
Almo

マクロを定義します NOMINMAX

これにより、Windef.hの最小および最大の定義が抑制されます。

83
hmjd

関数名を括弧で囲むだけです:

(std::numeric_limits<size_type>::max)()

この場合、NOMINMAXマクロは不要です。さらに、コンパイラの警告は表示されません。

54
NIRO

Cinバッファーをフラッシュしようとしていますか?私はいつも使用しました:

cin.ignore(cin.rdbuf()->in_avail());
9
Littlegator

誰かがNOMINMAXなしでwindows.hを含んでいるかどうかわからない場合、定義を変更せずに関数のようなマクロ呼び出しを抑制するために使用できるダミーマクロを定義できます。

#define DUMMY
...
std::numeric_limits<std::streamsize>::max DUMMY ()

あまりきれいでもありませんが、機能し、邪魔になりません。

Windowsヘッダーファイルを使用するときは、グローバルネームスペースに大量のゴミをスローするため、(必要に応じてpimplを使用して)専用のコードとヘッダーファイルにのみ含めることで、できる限り隠すことを好みます。

8
Philipp

GDI +を使用する場合、GDI +のヘッダーにはグローバル名前空間のNOMINMAXまたはminが必要なため、maxを使用したアプローチはうまくいきません。

この場合の最も簡単な回避策は、min/maxが不要になったときに定義を解除することです。

アプローチを説明するためのコードサンプル:

//#define NOMINMAX - this won't work
#include <Windows.h>
#include <gdiplus.h>
#undef max
#undef min
...
#include <cxxopts.hpp>
2
AntonK