2009-09-06 3 views
11

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

最大限の移植性を実現するには、どのような方法が推奨されますか?

答えて

11

Iは、このヘッダが特に有用であることが判明:(保守および検査を招く)自身のホイールを発明より BOOST cstdint

通常よりよいです。

3

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

2

2つのことにコンパイルするときにことを確認してください:

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

実行時にsizeof演算子を使用することもできます。

こちらがお役に立てば幸いです。 。 。 K

8

はtypes.hで呼ばれるヘッダファイルを作成し、あなたが必要なすべての固定サイズのプリミティブ型(INT32、UINT32、UINT8、など)を定義します。複数のプラットフォームをサポートするには、#ifdefを使用するか、プラットフォームごとに別々のインクルードディレクトリ(include_x86、include_x86_64、include_sparc)を使用できます。後者の場合、それぞれのプラットフォーム用に別々のビルド構成があります。これは、インクルードパスに適切なインクルードディレクトリを持ちます。 Stephen Dewhurstの "The C++ Gotchas"によると、2番目の方法が好ましい方法です。

異なるプラットフォーム間でバイナリデータを渡す予定がある場合は、バイトオーダについても心配する必要があります。

5

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

ブーストを使用している場合は、stdintヘッダーに相当するものも提供していると思います。

2

C99標準で定義されているstdint.hヘッダーがあります。(おそらく)ISO C++の変種などです。これはint16_t、uint64_tなどのような素晴らしい型を定義しています...特定のサイズと表現を持つことが保証されています。残念ながら、その可用性は厳密には標準的ではありません(マイクロソフトは特にここでは足元をドラッガーでした)。

  • すべての短い変数は2バイト
  • ているすべてのchar型の変数は1バイトです

    • 単純な答えは、私が知っ全ての32ビットまたは64ビットのバイト・アドレス可能なアーキテクチャ上で動作され、これであります

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

    32ビットコンパイラの中には64ビットタイプがまったくないことに注意してください。したがって、long longを使用すると、64ビットシステムとコンパイラのセット(gccとMSVCが含まれます)人々はこの問題を気にしません)。

    +1

    私はいくつかのプラットフォームで 'int'を64ビットと見ました。 'long long'はC++では標準ではなく、' long'と同じかそれ以上のサイズであることが保証されています。いくつかのまれなシステムでは、 'char'は16ビットです。これらはあなたが作っている移植可能な仮定ではありません。これが、Win32やLinux-32から64ビットに移植された場合、多くのソフトウェアに問題がある理由です。 – greyfade

    +4

    このようなレスポンスが、私が携帯型の回答から始まった理由です。しかし、申し訳ありませんが、あなたの大虐殺は証拠が欠けています。私は64ビットにintを定義するプラットフォームはどこにもないことを知っています。 「長い間」は、実際には非標準です。それでも面白いことに、これは標準の64ビットタイプよりコンパイラ全体ではるかに移植性があります。人々がこれを認めないことは悲しいことです。 目標は標準ではなく、移植性です。私の答えは、実用的な移植性の問題でした。 –

    1

    名前が2つのアンダースコア(__)で始まる場合、データ型は非標準です。

    __int8(符号なし__int8)

    __int16(符号なし__int16)

    __INT32(符号なし__INT32)

    __int64(符号なし__int64)

    しようを使用boost/cstdint.hpp