C ++では、固定幅の整数はオプションとして定義されていますが、実際に定義されているかどうかを確認するための推奨方法を見つけることができないようです。
固定幅の整数が使用可能かどうかを確認するための移植可能な方法は何でしょうか?
cppファイルをコンパイルし、コンパイルが失敗したかどうかに応じて、定義可能なマクロが設定されているかどうかに応じて、特定の言語機能をテストできます。
AC_TYPE_INT8_Tなど
C ++では、固定幅の整数はオプションとして定義されていますが、実際に定義されているかどうかを確認するための推奨方法を見つけることができないようです。
固定幅の整数が使用可能かどうかを確認するための移植可能な方法は何でしょうか?
cppファイルをコンパイルし、コンパイルが失敗したかどうかに応じて、定義可能なマクロが設定されているかどうかに応じて、特定の言語機能をテストできます。
AC_TYPE_INT8_Tなど
回答:
固定幅整数型が提供されているかどうかを判断するには、対応するマクロ[U]INT*_MAXまたは[U]INT*_MINマクロのいずれかが定義されているかどうかを確認できます。
// may be necessary for your C++ implementation
#define __STDC_LIMIT_MACROS
#include <cstdint>
#ifdef INT32_MAX
// int32_t must be available to get here
int32_t some32bitIntVariable;
#endif
あたり7.20整数型<stdint.h>、C11標準の段落4(太字の部分を注意してください):
実装が提供する、ここで説明するタイプごとに、
<stdint.h>そのtypedef名前を宣言し、関連するマクロを定義します。逆に、実装で提供されていない、ここで説明するタイプごとに、<stdint.h>そのtypedef名前を宣言したり、関連するマクロを定義したりしないでください。
C ++はを介してC実装を継承し<cstdint>ます。詳細については、<cstdint>vs<stdint.h>を参照してください。参照してください何__STDC_LIMIT_MACROSと__STDC_CONSTANT_MACROS意味ですか?詳細については__STDC_LIMIT_MACROS。
したがって、場合にはint32_t利用可能で、INT32_MAXかつINT32_MINなければなりません#defineD」。逆に、場合はint32_t利用できません、どちらINT32_MAXもINT32_MINあることが許可されている#defineD」。
ただし、@ NicolBolasが別の回答で述べたように、実際に確認する必要がない場合もあります。
[U]INT*_C最小および最大マクロの代わりに確認する方が短くなります
大まかに言えば...そうではありません。
固定サイズの整数型を使用する必要がある場合、それはそれらの型を特定のサイズにすることを明示的に必要とすることを意味します。つまり、これらのサイズの整数を取得できない場合、コードは機能しなくなります。したがって、それらを使用する必要があります。上記の型がないコンパイラでコードを使用すると、コードはコンパイルされません。コンパイルしてもコードが機能しなかったので、これは問題ありません。
実際に固定サイズの整数は必要ないが、他の理由で単にそれらが必要な場合は、int_least_*型を使用してください。実装がそのサイズを正確に提供できる場合、least_*型はそのサイズになります。
uint8_t)が、このコードは、バイトが8ビットではないプラットフォームで実行する必要がありました(これは、古いC ++実装、uint8_tそれが利用できない唯一の理由でしょうか?)つまり、下位互換性の外で、なぜこれを行う必要があったのですか?
uint8_tでした。
O(1)対O(n)努力。人々が例を使用するのと同じ理由uint16_t。あなたは「なぜuint32_tを使用して自分でキャストしないのか」と尋ねていますが、その答えは明白です。
uint16_t。私の理由は、私のマシンのエンディアンを使用して、バイナリの符号なし整数としてフォーマットされた正確に16ビットのデータを取得することを期待しているデバイス/フォーマット/などと通信していることです。正確に言えば、それと効果的に通信することははるかに困難です。私のプログラム(および私が使用するAPI)は、それを提供していないマシンでは基本的に機能しません。
#if defined(INT8_MIN)