59

この行は小さなテストプログラムでは正しく機能しますが、必要なプログラムでは、次のコンパイラの苦情があります。

#include <limits>

x = std::numeric_limits<int>::max();

c:\...\x.cpp(192) : warning C4003: not enough actual parameters for macro 'max'
c:\...\x.cpp(192) : error C2589: '(' : illegal token on right side of '::'
c:\...\x.cpp(192) : error C2059: syntax error : '::'

同じ結果が得られます:

#include <limits>
using namespace std;

x = numeric_limits<int>::max();

maxをマクロmax(a、b)と見なすのはなぜですか。?

4

6 に答える 6

76

これは通常、minまたはmaxマクロを定義するWindowsヘッダーを含める場合に発生します。Windowsヘッダーを使用している場合は#define NOMINMAX、コードを挿入するか、同等のコンパイラスイッチを使用してビルドします(つまり、 VisualStudioの場合は/DNOMINMAXを使用します)。

を使用してビルドするとNOMINMAX、プログラム全体でマクロを使用できなくなることに注意してください。minまたはmax操作を使用する必要がある場合は、ヘッダーからstd::min()またはを使用してください。std::max()<algorithm>

于 2009-12-15T01:14:42.100 に答える
68

他の解決策は、次のように関数名を括弧で囲むことです(std::numeric_limits<int>::max)()。同じことが。にも当てはまりますstd::max

これに適したソリューションかどうかはわかりません...NOMINMAXの方がIMOの方が優れていますが、場合によってはこれがオプションになる可能性があります。

于 2012-11-26T14:02:06.080 に答える
27

他のヘッダーファイルがmaxマクロでグローバル名前空間を汚染しています。マクロの定義を解除することで、これを修正できます。

#undef max
x = std::numeric_limits<int>::max();
于 2009-12-15T01:11:51.933 に答える
3
#ifdef max
#pragma push_macro("max")
#undef max
#define _restore_max_
#endif

#include <limits>

//... your stuff that uses limits

#ifdef _restore_max_
#pragma pop_macro("max")
#undef _restore_max_
#endif
于 2015-01-23T03:16:16.083 に答える
1

(std :: neuro_limits :: max)()

やさしい。

于 2019-04-10T21:12:31.003 に答える
0

Visual Studio 2013での定義(間隔を広げるためにフォーマットされています...)は次のとおりです。

static _Ty (max)() _THROW0()
{   // return maximum value
    return (FLT_MAX);
}

だから私はFLT_MAXを使用しています。:)これは普遍的な解決策ではないかもしれませんが、私の場合はうまくいくので、共有したいと思いました。

于 2015-05-15T23:01:05.717 に答える