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
が上記のいずれかの#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)
コメントすることはできませんので、ここにグレン対リオールコーガンの答えに対する私の意見があります。
静的変数を使用している場合、クラス内の定数値をnumeric_limits :: max()に割り当てると、初期化の順序のためにその値が実際にゼロに設定されるという問題が発生します(この記事を参照- ローカルスコープの静的変数のゼロ初期化および静的初期化 )
したがって、その場合、Lior Koganの回答を使用することによってのみ機能します。
// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan
#define UINT32_MAX ((uint32_t)-1)
代わりに、コンパイラプロセスの#include
シンボルを定義するようにビルドプロセスを変更することにより、__STDC_LIMIT_MACROS
順序の問題を解消できる場合があります。
cxx -D__STDC_LIMIT_MACROS ...
もちろん、ヘッダー#undef
sがこのシンボルである場合、依然として問題が発生します。
また、使用している標準ライブラリ実装の作成者は、ユーザーがその特定のシンボルを設定することを意図していない可能性があります。ユーザーがC++でC99型を有効にするために使用するコンパイラフラグまたは別のシンボルがある場合があります。