質問

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 が含まれるため、ほとんどの人は気にしないでしょう) に制限されることに注意してください。この問題)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top