77

だから私はcinから有効な整数入力を取得しようとしていて、この質問への答えを使用しました。

推奨:

#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);
}

maxこれは、マクロがそれほど多くの引数をとらないと言って、Windowsでエラーを出します。つまり、私はこれをしなければなりません

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後でそれを再定義する必要がありますか?

4

5 に答える 5

115

マクロを定義しNOMINMAXます:

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

于 2012-07-18T14:49:08.300 に答える
85

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

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

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

于 2015-04-20T08:24:52.110 に答える
12

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

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

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

Windowsヘッダーファイルを操作するときは、グローバル名前空間に大量のガベージをスローするため、特殊なコードとヘッダーファイル(必要に応じてpimplを使用)にのみインクルードすることで、できるだけ非表示にすることを好みます。

于 2012-07-18T21:48:17.030 に答える
10

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

cin.ignore(cin.rdbuf()->in_avail());
于 2012-07-18T14:51:12.950 に答える
6

GDI +を使用する場合、GDI +のヘッダーにはグローバル名前空間が必要であるため、このアプローチは機能NOMINMAXしません。minmax

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

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

//#define NOMINMAX - this won't work
#include <Windows.h>
#include <gdiplus.h>
#undef max
#undef min
...
#include <cxxopts.hpp>
于 2017-08-09T22:43:41.380 に答える