web-dev-qa-db-ja.com

移植可能なコードにlong longまたはint64_tを使用する必要がありますか?

私はCとC++の両方で書かれたオープンソースのコードベースを持っています。 少なくとも 64ビット幅であることが保証されている整数型を探しています。これは、ほとんどのOS X(Intel、64ビット)およびオープンソースCのLinuxボックスで確実にコンパイルできます。およびC++コンパイラ。エンドユーザー側で余分な作業を行う必要はありません。現時点では、Windowsおよび32ビットクライアントのサポートは重要ではありません。

OS Xでいくつかのテストを行いましたが、開発者ツールに同梱されている最新のGCCはC + 11モードをサポートしていません(したがって、long longの可用性を保証していないようです)。 Clangはこれもサポートしていませんが、特定のバージョンの後、C99モードが有効になっている場合はlong longをサポートします。

移植性が重要な目標である場合、int64_tの代わりにlong longを使用することが一般的な提案ですか?書式指定子を使用するのは大変なようです。

int64_tlong longに(および同様にuint64_tと同等のunsignedに)確実にキャストして、long longを取得する既存の関数とライブラリで使用できますかパラメータとして? (もちろん、また戻ってきます。)

その心の中で、GCCにないClang機能を必要とするコードを出荷する場合、ClangはLinuxで選択するコンパイラとしてGCCを置き換えるつもりですか?ほとんどの場合、エンドユーザーにソースコードを提供するときに、そのコンパイラは期待できるものですか?

基本的に、ポータブルCおよびC++コードに両方のタイプを使用している他の開発者に、上記の目標を念頭に置いて、より良い長期的な方法について提案があるかもしれません。 。

39
Alex Reynolds

タイプlong longおよびunsigned long longは、それぞれが少なくとも64ビットの標準Cおよび標準C++タイプです。私が知っているすべてのコンパイラは、おそらく-pedanticモードの場合を除き、これらのタイプを提供しますが、この場合はint64_tまたはuint64_tもC++ 2011より前のコンパイラでは使用できません。 。すべてのシステムで<stdint.h>も利用可能です。つまり、私が知る限り、タイプをどのように綴るかは重要ではありません。 <stdint.h>の主な目標は、特定のビット数に最適な一致を提供することです。少なくとも64ビットが必要で、そのような型の高速実装を利用したい場合は、int_least64_tまたはuint_least64_t<stdint.h>または<cstdint>を使用します(後者の場合、名前は名前空間stdで定義されます)。

32
Dietmar Kühl

移植性が重要な目標である場合、int64_tの代わりにlong longを使用することが一般的な提案ですか?

コンパイラがint64_tを提供したがlong longを提供しなかった場合、私は非常に驚いたでしょう。

long longが存在する場合、少なくとも64ビットが必要であるため、(u)int64_tから(unsigned) long longへのキャストは値を保持します。

exactly64ビットの型が必要な場合は、(u)int64_tを使用します。少なくとも64ビットが必要な場合は、(unsigned) long longは、(u)int_least64_tと同様に完全に問題ありません。

25
Daniel Fischer