だから私は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
の定義を保存し、後で再定義する必要がありますか?
マクロを定義します NOMINMAX
:
これにより、Windef.hの最小および最大の定義が抑制されます。
関数名を括弧で囲むだけです:
(std::numeric_limits<size_type>::max)()
この場合、NOMINMAXマクロは不要です。さらに、コンパイラの警告は表示されません。
Cinバッファーをフラッシュしようとしていますか?私はいつも使用しました:
cin.ignore(cin.rdbuf()->in_avail());
誰かがNOMINMAX
なしでwindows.h
を含んでいるかどうかわからない場合、定義を変更せずに関数のようなマクロ呼び出しを抑制するために使用できるダミーマクロを定義できます。
#define DUMMY
...
std::numeric_limits<std::streamsize>::max DUMMY ()
あまりきれいでもありませんが、機能し、邪魔になりません。
Windowsヘッダーファイルを使用するときは、グローバルネームスペースに大量のゴミをスローするため、(必要に応じてpimplを使用して)専用のコードとヘッダーファイルにのみ含めることで、できる限り隠すことを好みます。
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>