C++ のクロスプラットフォームのプリミティブ データ型
-
21-09-2019 - |
質問
Java や C# とは異なり、C++ のプリミティブ データ型のサイズはプラットフォームに応じて異なります。例えば、 int
32 ビット整数であることは保証されません。さまざまなコンパイラ環境では、次のようなデータ型が定義されています。 uint32
または dword
この目的のためですが、固定サイズのデータ型用の標準インクルード ファイルはないようです。
最大限の移植性を実現するために推奨される方法は何ですか?
解決
私は、このヘッダが特に有用であることが見出さ。 BOOST cstdintする
通常、より良い(メンテナンスおよびテストを負担)自分の車を発明よります。
他のヒント
types.hで呼ばれるヘッダファイルを作成し、あなたが必要なすべての固定サイズのプリミティブ型(INT32、UINT32、UINT8、など)を定義します。複数のプラットフォームをサポートするには、いずれかの利用#ifdef
のかは、個別の各プラットフォーム(include_x86、include_x86_64、include_sparc)用のディレクトリを含めることができます。後者の場合、あなたは右の彼らのインクルードパスにディレクトリを含める必要があります各プラットフォーム用に別々のビルド構成を持っているでしょう。第二の方法は、スティーブンデューハーストによる「C ++落とし穴」によれば、好ましい。
だけはさておき、あなたはまた、バイト順を心配する必要があります。
C99標準の一部は、この種の情報を提供するstdint.hヘッダファイルでした。例えば、それはのuint32_tと呼ばれるタイプを定義します。残念ながら、コンパイラの多くはstdint.hをサポートしていません。私はstdint.hで見た中で最高のクロスプラットフォームの実装はここにある:のhttp:// WWW。 のazillionmonkeys.com/qed/pstdint.h。あなたは自分のプロジェクトにすることを含めることができます。
あなたはブーストを使用している場合は、私は信じてそれがまたstdintヘッダに何か相当を提供しています。
ヘッダ・ファイルに(例えばINT32)タイプを定義します。プラットフォームごとに別の#ifdefを使用してくださいIN32は、32ビットの整数であることを確認します。どこでもあなたのコード使用INT32で、あなたは、異なるプラットフォーム上でコンパイルしたときに右の
を定義使用していることを確認してください2つのこと:
まず、便利なプラットフォームの多くを提供しますlimits.hに呼ばれるヘッダファイルがあります 具体的な情報。これは、例えばint型の最大値と最小値を与えます。 それから、あなたはint型がどのように大きな推測することができます。
あなたは、あまりにもこれらの目的のために、実行時にはsizeof演算子を使用することができます。
私はこのことができます願っています。 。ます。
K
名前が 2 つのアンダースコア (__) で始まる場合、データ型は非標準です。
__int8 (符号なし __int8)
__int16 (符号なし __int16)
__int32 (符号なし __int32)
__int64 (符号なし __int64)
使ってみてください ブースト/cstdint.hpp
C99 標準と (おそらく) ISO C++ の何らかのバリアントによって定義された stdint.h ヘッダーがあります。これにより、int16_t、uint64_t などの優れた型が定義されます。特定のサイズと表現を持つことが保証されています。残念ながら、その可用性は完全に標準ではありません (特に Microsoft はここで足を引っ張りました)。
簡単な答えは次のとおりです。これは、私が知っているすべての 32 ビットまたは 64 ビットのバイトアドレス指定可能なアーキテクチャで動作します。
- すべての char 変数は 1 バイトです
- すべての short 変数は 2 バイトです
- すべての int 変数は 4 バイトです
- サイズが不定の「long」は使用しないでください。
- 64 ビット演算をサポートする既知のコンパイラはすべて、ネイティブ 64 ビット型として「long long」を許可します。
一部の 32 ビット コンパイラには 64 ビット型がまったくないため、long long を使用すると、64 ビット システムと小規模なコンパイラ セット (gcc と MSVC が含まれるため、ほとんどの人は気にしないでしょう) に制限されることに注意してください。この問題)。