2013-04-30 27 views
18

uint64_tの最大値を表すマクロは、UINT_MAXunsigned intとしています。 つまり、(1 < < 64)-1であることが保証されるためには、この値が必要です。 uint64_tの最大値を表すマクロ

は私が UINT64_MAXを使用しようとしましたが、中にG ++でコンパイルした結果:

'UINT64_MAX' was not declared in this scope 

それはUINT64_MAXを使用する前に、私はコードでこの行#define __STDC_LIMIT_MACROSを持っていることを言及する価値があります。

私は、Web上で役に立つ情報が見つからないことに驚いていました。

+0

idk what '#define __STDC_LIMIT_MACROS'はインクルードの前で、' UINTwhatever'の使用前ではありません。 –

+0

C++ 11の実装では、 'UINT64_MAX'を提供する' cstdint'が付属しています。 Boostは、このヘッダーが利用可能であれば、このヘッダーの実装も提供します。 – pmr

+7

なぜマクロはC++ですか? 'std :: numeric_limits :: max()'は動作しませんか? –

答えて

14

cstdintヘッダーを移植することは、非常に困難です(一部のMSVCの実装にはありません)。同時に、numeric_limits::max()constexprなしでは使用しにくく、実際にはuint64_tで作業する必要はありません。あなたがそれらのことをあまり気にしないなら、std::numeric_limits<uint64_t>::max()がこのトリックを行う可能性が最も高いでしょう。

Boost.Integerは、cstdintの実装を持ち、一定の最大値を得るために追加の特性クラスが付属しています。 cstdintの準拠実装では、マクロUINT64_MAXも提供する必要がありますが、私はboostについてはわかりません。

+0

2番目のブースト整数。それは私が信じているほとんどのコンパイラのどこでも使用できるヘッダーだけです。 –

+0

詳細な回答ありがとうございます。ちょうど不思議な理由は、関数呼び出しを保存するためにUINT_MAXとしてマクロがないのですか? – Subway

+1

@Subway maxはconstexprなので、C++ 11ではnumeric_limitsの関数呼び出しはありません。 – pmr