質問
C99では、私はstdint.h含まれ、それは私にUINT32_MAXなどのuint32_tを与えます。しかし、C ++でUINT32_MAXが出て定義されます。私はstdint.hを含む前__STDC_LIMIT_MACROSを定義することができ、誰かがすでに自身stdint.hを含めた後、私のヘッダを含めている場合、これは動作しません。
だから、C ++で、のuint32_tで最大値の表現を見つけるための標準的な方法は何でしょうか。
解決
さて、私がuint32_t
については知らないが、基本型(bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double
)のためにあなたがnumeric_limits
経由#include <limits>
テンプレートを使用する必要があります。
cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
uint32_t
がこのコードよりも上記の1の#define
ある場合は、ボックス
の外に動作するはずです cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;
他のヒント
std::numeric_limits<T>::max()
は型T
の最大値を定義します。
さて、のuint32_tは常にあなたが安全にそれを手動で定義することができますので、署名のないことが常に32ビットである、となります:
#define UINT32_MAX (0xffffffff)
また、行うことができます。
#define UINT32_MAX ((uint32_t)-1)
あなたは代わりに、コンパイラのコマンドラインで#include
記号を定義するためにビルドプロセスを変更することにより、__STDC_LIMIT_MACROS
順序の問題を解消できる可能性があります:
cxx -D__STDC_LIMIT_MACROS ...
ヘッダ#undef
s場合は、もちろん、あなたはまだこのシンボルを悩みを持っているでしょう。
また、使用している標準ライブラリの実装の著者らは、特定のシンボルを設定するユーザーを対象としていない可能性があります。コンパイラフラグやユーザーがC ++でのC99型を有効にするために使用することが意図されている別のシンボルがあるかもしれません。
私はLIORコーガンの答え対グレンの私の入力があるので、ここでコメントすることはできません。
あなたは静的変数を使用している場合は、あなたがのnumeric_limitsにクラス::マックス(内側の一定の値を割り当てる場合は、その問題に実行されます)、その値があるため、初期化のためのゼロに設定することになります(これを参照してくださいポストゼロ初期化とローカルスコープ静的変数の静的初期化)
だから、その場合にはそれが唯一のLIORコーガンの答えを使用して動作します。
// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan
#define UINT32_MAX ((uint32_t)-1)