2013-04-09 12 views
6

C++ for Windows(MinGW)およびLinux(g ++)でクロスプラットフォームコードを記述しようとしています。私はLinuxで64ビット整数を "long"として定義していましたが、MinGWに移動するとsizeof(long)は4バイトを返しました。そして、私は、MinGWで64ビット整数を定義するために "long long"または "__INT64"を使用できることを発見しました。WindowsおよびLinux用のC++での64ビット整数のクロスプラットフォーム定義

1. WindowsとLinuxの両方で64ビット整数を定義する最も移植性の高い方法は何ですか?私は現在の#ifdefを使用していますが、これはそれを行うための最善の方法であれば、私にはわからない:

#ifdef LINUX 
    #define INT64 long 
#elif WIN32 
    #define INT64 long long 
#endif 

2.- 私はMinGWの中で「長い長い」使用するか、「__int64」でしょうか?なぜ?

+2

私はあなたが細長いと言いたかったのですが、ダブルダブルではありません。 – drahnr

+0

@drahnr私の投稿は編集しました。 –

答えて

11

cstdintというヘッダーに定義されているタイプint64_tを使用できます。これはC++ 11の標準です。

使用しているプラ​​ットフォームが64ビット整数をサポートしていない場合、このタイプは存在しない可能性があることに注意してください。

long longについては、これも別の可能性です。 long longは少なくとも64ビット幅です。 C++ 11を使用している場合、いくつかのコンパイラで動作しますが、C++ 11の標準でもあります。

Pete Beckerの言葉通り、int_least64_tを使用できます。正確に64ビットの整数を使用しても構いませんが、の整数型のうち、少なくともの64ビットの整数型を使用することをお勧めします。

+2

おそらくもっと良い選択です:常に存在するint_least64_tです。 –

+0

@PeteBecker nice、ありがとう。 – mfontanini

+0

正確なサイズのtypedefはオプションであるため、正確なビット数が必要ない場合は、最小および高速の型を使用する方が移植性が高くなります。 – rubenvb

2

64ビット整数を取得する方法は十分に答えられましたが、「long long」または「__INT64」を使用するかどうかは、2番目の方法で確認します。あなたが最初に答える必要があるのは、必要なものです。何らかの理由で正確に64ビットが必要な場合は、丁度その64ビットを与えるもの、つまりint64_tを使用してください。あなたのプラットフォーム/コンパイラがstdint.hを持っていなくても、あなたのコードをより自己記述的にするために、回避策(#ifdef'dをコンパイラ用に)として適切な型としてtypedefを作成してください。一方、例えばあなたが取り扱っている場合。 (例えばDVD画像のような)大きなメモリセグメントにおけるオフセットは、典型的には自己文書化しているポインタと同じサイズであるため、size_tまたはssize_tを使用する。同様に、ファイル内のオフセットはfpos_tを使用して最もよく表されます。

ところで:Linuxでは "long"が64ビットであるという前提が間違っています。特に32ビット版では、ではなく、 64ビットであり、実際にはすべての64ビット版が64ビット長を使用するかどうかはわかりません。これらの異なるシステムはILP32、LP64、LLP64と呼ばれています。ウェブ上でそれらの用語を検索してください!

+0

Linuxでは64ビットの長さが長いと仮定していますが、言い回しにはもっと注意する必要があります。答えをありがとう。 –

関連する問題