windows.h が含まれているのに std::min が失敗するのはなぜですか? 質問する

windows.h が含まれているのに std::min が失敗するのはなぜですか? 質問する
#include <algorithm>
#include <Windows.h>

int main()
{
    int k = std::min(3, 4);
    return 0;
}

Windows.h をインクルードすると、Windows は何をしますか? Visual Studio 2005 では使用できません。std::minエラー メッセージは次のとおりです:

error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'

ベストアンサー1

ヘッダーwindows.hファイル (または、より正確には、windef.hそのヘッダー ファイルに含まれるファイル) には、干渉する および のminマクロが含まれています。max

それを含める前に行う必要があります#define NOMINMAX


実際、たとえそうだったとしても、いいえマクロの単純な定義は、関数のようなマクロがなぜ悪い考えであるかを示しているため、矛盾が生じます。

#define max(a,b) ((a)>(b)?(a):(b))

たとえば、次のようにしてそのマクロを呼び出すとします。

int x = 5, y = 10;
int c = max(x++, y--);

すると、y期待どおりの結果にはなりません。たとえば、次のように展開されます。

int c = ((x++)>(y--)?(x++):(y--));

その式は (さらに悪いことになる未定義の動作が発生しない限り) y2 回減分しますが、これは予想外のことです。

最近は基本的にマクロを条件付きコンパイルにのみ使用していますが、古いマクロの他の 2 つの主要な使用例 (シンボリック定数と関数のようなマクロ) は、より現代的な言語機能 (実際の列挙型とインライン関数の提案) でより適切に処理されます。

おすすめ記事