Java や C# とは異なり、C++ のプリミティブ データ型は、プラットフォームによってサイズが異なる場合があります。たとえば、int
は 32 ビット整数であるとは限りません。さまざまなコンパイラ環境で、この目的のためにuint32
やなどのデータ型が定義dword
されていますが、固定サイズのデータ型用の標準インクルード ファイルはないようです。
最大限の移植性を実現するための推奨される方法は何ですか?
Java や C# とは異なり、C++ のプリミティブ データ型は、プラットフォームによってサイズが異なる場合があります。たとえば、int
は 32 ビット整数であるとは限りません。さまざまなコンパイラ環境で、この目的のためにuint32
やなどのデータ型が定義dword
されていますが、固定サイズのデータ型用の標準インクルード ファイルはないようです。
最大限の移植性を実現するための推奨される方法は何ですか?
このヘッダーが特に役立つことがわかりました: BOOST cstdint
通常、独自のホイールを発明するよりも優れています (メンテナンスとテストが発生します)。
types.hというヘッダーファイルを作成し、必要なすべての固定サイズのプリミティブ型(int32、uint32、uint8など)を定義します。複数のプラットフォームをサポートするには、を使用するか、#ifdef
プラットフォームごとに個別のインクルードディレクトリ(include_x86、include_x86_64、include_sparc)を使用できます。後者の場合、プラットフォームごとに個別のビルド構成があり、インクルードパスに適切なインクルードディレクトリがあります。StephenDewhurstによる「TheC++Gotchas」によると、2番目の方法が望ましいです。
余談ですが、異なるプラットフォーム間でバイナリデータを渡すことを計画している場合は、バイト順序についても心配する必要があります。
C99標準の一部は、この種の情報を提供するためのstdint.hヘッダーファイルでした。たとえば、uint32_tというタイプを定義します。残念ながら、多くのコンパイラはstdint.hをサポートしていません。stdint.hについて私が見た中で最高のクロスプラットフォームの実装は、ここにあります:http ://www.azillionmonkeys.com/qed/pstdint.h 。それをプロジェクトに含めることができます。
Boostを使用している場合は、stdintヘッダーと同等のものも提供されると思います。
ヘッダー ファイルで型 (int32 など) を定義します。プラットフォームごとに別の #ifdef を使用し、in32 が 32 ビット整数であることを確認します。コードのどこでも int32 を使用し、異なるプラットフォームでコンパイルするときに正しい定義を使用していることを確認してください
C99標準で定義されたstdint.hヘッダーと、(私が思うに)ISOC++のバリアントまたは別のものがあります。これは、int16_t、uint64_tなどのような、特定のサイズと表現を持つことが保証されている優れたタイプを定義します。残念ながら、その可用性は正確には標準ではありません(特に、Microsoftはここでは足を引っ張っていました)。
簡単な答えはこれです。これは、私が知っているすべての32ビットまたは64ビットのバイトアドレス可能なアーキテクチャで機能します。
一部の32ビットコンパイラには64ビットタイプがまったくないため、long longを使用すると、64ビットシステムと少数のコンパイラセット(gccとMSVCを含む)に制限されるため、ほとんどの人は気にしません。この問題)。
2つのこと:
まず、多くの有用なプラットフォーム固有の情報を提供する、limits.h と呼ばれるヘッダー ファイルがあります。たとえば、int型の最大値と最小値を提供します。そこから int 型の大きさを推測できます。
これらの目的のために、実行時に sizeof 演算子を使用することもできます。
これがお役に立てば幸いです。. .
K