11

Java や C# とは異なり、C++ のプリミティブ データ型は、プラットフォームによってサイズが異なる場合があります。たとえば、intは 32 ビット整数であるとは限りません。さまざまなコンパイラ環境で、この目的のためにuint32やなどのデータ型が定義dwordされていますが、固定サイズのデータ​​型用の標準インクルード ファイルはないようです。

最大限の移植性を実現するための推奨される方法は何ですか?

4

7 に答える 7

11

このヘッダーが特に役立つことがわかりました: BOOST cstdint

通常、独自のホイールを発明するよりも優れています (メンテナンスとテストが発生します)。

于 2009-09-06T14:17:38.240 に答える
8

types.hというヘッダーファイルを作成し、必要なすべての固定サイズのプリミティブ型(int32、uint32、uint8など)を定義します。複数のプラットフォームをサポートするには、を使用するか、#ifdefプラットフォームごとに個別のインクルードディレクトリ(include_x86、include_x86_64、include_sparc)を使用できます。後者の場合、プラットフォームごとに個別のビルド構成があり、インクルードパスに適切なインクルードディレクトリがあります。StephenDewhurstによる「TheC++Gotchas」によると、2番目の方法が望ましいです。

余談ですが、異なるプラットフォーム間でバイナリデータを渡すことを計画している場合は、バイト順序についても心配する必要があります。

于 2009-09-06T13:55:20.653 に答える
5

C99標準の一部は、この種の情報を提供するためのstdint.hヘッダーファイルでした。たとえば、uint32_tというタイプを定義します。残念ながら、多くのコンパイラはstdint.hをサポートしていません。stdint.hについて私が見た中で最高のクロスプラットフォームの実装は、ここにあります:http ://www.azillionmonkeys.com/qed/pstdint.h 。それをプロジェクトに含めることができます。

Boostを使用している場合は、stdintヘッダーと同等のものも提供されると思います。

于 2009-09-06T13:55:49.767 に答える
3

ヘッダー ファイルで型 (int32 など) を定義します。プラットフォームごとに別の #ifdef を使用し、in32 が 32 ビット整数であることを確認します。コードのどこでも int32 を使用し、異なるプラットフォームでコンパイルするときに正しい定義を使用していることを確認してください

于 2009-09-06T13:45:05.373 に答える
2

C99標準で定義されたstdint.hヘッダーと、(私が思うに)ISOC++のバリアントまたは別のものがあります。これは、int16_t、uint64_tなどのような、特定のサイズと表現を持つことが保証されている優れたタイプを定義します。残念ながら、その可用性は正確には標準ではありません(特に、Microsoftはここでは足を引っ張っていました)。

簡単な答えはこれです。これは、私が知っているすべての32ビットまたは64ビットのバイトアドレス可能なアーキテクチャで機能します。

  • すべてのchar変数は1バイトです
  • すべての短い変数は2バイトです
  • すべてのint変数は4バイトです
  • サイズが不定の「長い」ものは使用しないでください。
  • 64ビット演算をサポートするすべての既知のコンパイラは、ネイティブ64ビット型として「longlong」を許可します。

一部の32ビットコンパイラには64ビットタイプがまったくないため、long longを使用すると、64ビットシステムと少数のコンパイラセット(gccとMSVCを含む)に制限されるため、ほとんどの人は気にしません。この問題)。

于 2009-09-06T13:56:14.863 に答える
2

2つのこと:

まず、多くの有用なプラットフォーム固有の情報を提供する、limits.h と呼ばれるヘッダー ファイルがあります。たとえば、int型の最大値と最小値を提供します。そこから int 型の大きさを推測できます。

これらの目的のために、実行時に sizeof 演算子を使用することもできます。

これがお役に立てば幸いです。. .

K

于 2009-09-06T13:46:26.680 に答える