私は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_t
をlong long
に(および同様にuint64_t
と同等のunsigned
に)確実にキャストして、long long
を取得する既存の関数とライブラリで使用できますかパラメータとして? (もちろん、また戻ってきます。)
その心の中で、GCCにないClang機能を必要とするコードを出荷する場合、ClangはLinuxで選択するコンパイラとしてGCCを置き換えるつもりですか?ほとんどの場合、エンドユーザーにソースコードを提供するときに、そのコンパイラは期待できるものですか?
基本的に、ポータブルCおよびC++コードに両方のタイプを使用している他の開発者に、上記の目標を念頭に置いて、より良い長期的な方法について提案があるかもしれません。 。
タイプ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
で定義されます)。
移植性が重要な目標である場合、
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
と同様に完全に問題ありません。