2012-09-17 10 views
31

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

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

移植性が重要な目標である場合、long longの代わりにint64_tを使用することをお勧めしますか?書式指定子の使用は苦しいようです。

は、私は確実にパラメータとしてlong longを取り、既存の機能とライブラリでそれを使用するために(そして同様にuint64_tと同等unsignedに)long longint64_tをキャストすることはできますか?

GCCにないClangの機能を必要とするコードを出荷すると、ClangはGCCをLinuxの選択されたコンパイラとして置き換えようとしていますか?エンドユーザーにソースコードを提供する際に、コンパイラは何かを期待できますか?

基本的には、移植性の高いCおよびC++コードに両方のタイプを使用している他の開発者からのアドバイスをお願いしたいと思います。目標を念頭に置いて

+0

gccはC++ 11より前の拡張として 'long long'を持っていましたので、gcc拡張を無効にしない限り、gccで' long long'を使うとうまくいくはずです(実際は私は思いません私は長い間ずっと長い間長い間提供していないコンパイラを使っていました。 – Grizzly

+0

'int64_t'には基底型' long'や 'long long'があり、オーバーロードが必要な場合に移植性の問題を引き起こす可能性があることに注意してください。 –

+0

また、プラットフォームごとに簡単に変更できるようにtypedefを検討してください。 – imallett

答えて

26

タイプ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で定義されます)。

+0

私は128以上のようなより大きいタイプを追加するための標準を望んでいるでしょう。この日は暗号が多く使われているので、そうする必要はありません多くのライブラリに依存しています。 – farmdve

+0

多くのシステムが実際にSIMDをサポートして128ビットのタイプをサポートしていることは承知していますが、このようなタイプ(「long long long?」)の提案は見たことがありません:WG14および/またはWG21に提案を送ってください! –

+2

'long long long'は必要ありません。 128ビットの整数をサポートするシステムでは、*拡張整数型*を定義し、それらの型で 'int128_t'と' uint128_t'を定義することができます。 –

23

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

コンパイラはlong longint64_tを提供したが、されていない場合、私は非常に驚かれることと思います。

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

あなたが少なくとも 64ビット、(unsigned) long longが必要な場合は、(u)int64_tを使用し、正確 64ビットのタイプが必要な場合は、完全に罰金です。

関連する問題