JavaまたはC#と異なり、C++のプリミティブデータ型は、プラットフォームによって異なる場合があります。たとえば、int
は32ビット整数であるとは限りません。 さまざまなコンパイラ環境では、この目的でuint32
またはdword
などのデータ型が定義されていますが、固定サイズのデータ型の標準インクルードファイルは存在しないようです。C++のクロスプラットフォームプリミティブデータ型
最大限の移植性を実現するには、どのような方法が推奨されますか?
JavaまたはC#と異なり、C++のプリミティブデータ型は、プラットフォームによって異なる場合があります。たとえば、int
は32ビット整数であるとは限りません。 さまざまなコンパイラ環境では、この目的でuint32
またはdword
などのデータ型が定義されていますが、固定サイズのデータ型の標準インクルードファイルは存在しないようです。C++のクロスプラットフォームプリミティブデータ型
最大限の移植性を実現するには、どのような方法が推奨されますか?
Iは、このヘッダが特に有用であることが判明:(保守および検査を招く)自身のホイールを発明より BOOST cstdint
通常よりよいです。
ヘッダーファイルに型(int32など)を定義します。プラットフォームごとに別の#ifdefを使用し、in32が32ビット整数であることを確認します。どこでもあなたのコード使用INT32で、あなたが権利を使用して、異なるプラットフォーム定義
2つのことにコンパイルするときにことを確認してください:
まず、便利なプラットフォーム の多くを与えlimits.hに呼ばれるヘッダファイルがあります特定の情報。たとえば、int型の最大値と最小値を返します。 これから、int型の大きさを推測することができます。
実行時にsizeof演算子を使用することもできます。
こちらがお役に立てば幸いです。 。 。 K
はtypes.hで呼ばれるヘッダファイルを作成し、あなたが必要なすべての固定サイズのプリミティブ型(INT32、UINT32、UINT8、など)を定義します。複数のプラットフォームをサポートするには、#ifdef
を使用するか、プラットフォームごとに別々のインクルードディレクトリ(include_x86、include_x86_64、include_sparc)を使用できます。後者の場合、それぞれのプラットフォーム用に別々のビルド構成があります。これは、インクルードパスに適切なインクルードディレクトリを持ちます。 Stephen Dewhurstの "The C++ Gotchas"によると、2番目の方法が好ましい方法です。
異なるプラットフォーム間でバイナリデータを渡す予定がある場合は、バイトオーダについても心配する必要があります。
この種の情報を提供するために、C99標準の一部がstdint.hヘッダーファイルでした。たとえば、uint32_tというタイプを定義します。残念ながら、多くのコンパイラはstdint.hをサポートしていません。 stdint.hで見たクロスプラットフォームの実装の中で最も優れているのは、http://www.azillionmonkeys.com/qed/pstdint.hです。これをプロジェクトに含めることができます。
ブーストを使用している場合は、stdintヘッダーに相当するものも提供していると思います。
C99標準で定義されているstdint.hヘッダーがあります。(おそらく)ISO C++の変種などです。これはint16_t、uint64_tなどのような素晴らしい型を定義しています...特定のサイズと表現を持つことが保証されています。残念ながら、その可用性は厳密には標準的ではありません(マイクロソフトは特にここでは足元をドラッガーでした)。
単純な答えは、私が知っ全ての32ビットまたは64ビットのバイト・アドレス可能なアーキテクチャ上で動作され、これであります
32ビットコンパイラの中には64ビットタイプがまったくないことに注意してください。したがって、long longを使用すると、64ビットシステムとコンパイラのセット(gccとMSVCが含まれます)人々はこの問題を気にしません)。
名前が2つのアンダースコア(__)で始まる場合、データ型は非標準です。
__int8(符号なし__int8)
__int16(符号なし__int16)
__INT32(符号なし__INT32)
__int64(符号なし__int64)
しようを使用boost/cstdint.hpp
私はいくつかのプラットフォームで 'int'を64ビットと見ました。 'long long'はC++では標準ではなく、' long'と同じかそれ以上のサイズであることが保証されています。いくつかのまれなシステムでは、 'char'は16ビットです。これらはあなたが作っている移植可能な仮定ではありません。これが、Win32やLinux-32から64ビットに移植された場合、多くのソフトウェアに問題がある理由です。 – greyfade
このようなレスポンスが、私が携帯型の回答から始まった理由です。しかし、申し訳ありませんが、あなたの大虐殺は証拠が欠けています。私は64ビットにintを定義するプラットフォームはどこにもないことを知っています。 「長い間」は、実際には非標準です。それでも面白いことに、これは標準の64ビットタイプよりコンパイラ全体ではるかに移植性があります。人々がこれを認めないことは悲しいことです。 目標は標準ではなく、移植性です。私の答えは、実用的な移植性の問題でした。 –