43

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

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

移植性が重要な目標である場合int64_t、代わりに使用する一般的な提案はありますか? long longフォーマット指定子を使用するのは苦痛に思えます。

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

そのような考え方で、GCC にない Clang 機能を必要とするコードを出荷した場合、Clang は Linux で選択されるコンパイラとして GCC に取って代わるのでしょうか? そのコンパイラは、ソース コードをエンド ユーザーに提供するときに、ほとんどの場合、期待できるものでしょうか?

基本的に、移植可能な C および C++ コードに両方のタイプを使用したことのある他の開発者からのアドバイスをお願いしたいと思います。 .

4

3 に答える 3

35

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

于 2012-09-17T23:15:11.703 に答える
30

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

int64_tコンパイラが提供していても提供していない場合、私は非常に驚くでしょうlong long

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

正確に64 ビットの型が必要な場合は、少なくとも64 ビットが(u)int64_t必要な場合は を使用してください。(unsigned) long long(u)int_least64_t

于 2012-09-17T23:12:26.847 に答える