<cstdint>
内でtypedefを使用する必要があるかどうかを考えてきました。
個人的には、uint32_t
よりもunsigned int
、char
よりもint8_t
などを書く方がはるかに直感的です。
皆さんはどう思いますか? <cstdint>
のtypedefを使用するのは良い考えですか?不利な点はありますか?
実際には、両方を使用することをお勧めします。
間違いなく32ビットの符号なしのものが必要な場合は、uint32_tを使用してください。たとえば、仕様でフィールドの1つが32ビット符号なしとして定義されている外部オブジェクトを表す「構造体」を実装している場合です。
「マシンの自然なワードサイズ」であるものが必要な場合は、intまたはunsignedintを使用します。例えば:
for (int i = 0 ; i < 200 ; ++i)
// stuff
「マシンの自然なワードサイズ」は、今日のプロセッサと明日のプロセッサの両方で最高のパフォーマンスを提供します。
「文字」を意味する場合は「char」を使用します。 「バイト」を意味する場合は「char」または「unsignedchar」。 C/C++では、厳密に言えば、「char *」を介して任意のオブジェクトのバイトにアクセスできます。
Uint32_tと同様に、8ビット整数が特に必要な場合は、uint8_tまたはint8_tを使用します。
両方を使用する必要があります。 「適切なサイズの」整数が必要な場合は、他の回答で説明されているように、int
を使用する必要があります。文字が必要な場合はchar
を使用します。これは自己文書化です。
バイナリで外界とやり取りするときは、uint32_t
とその仲間を使用する必要があります。ネットワークプログラミング、バイナリファイルの処理、外部マルチバイトエンコーディングの使用などです。このような場合、型の正確なサイズは次のように重要です。正しく、ポータブルで、自己文書化するコードを書く。それが<stdint.h>
(またはC++ 0x <cstdint>
)の目的です。
(エンディアンも同様に重要ですが、それはまったく別の問題です。)
変数の目的によって異なります。
ループカウンターが必要な場合は、int
を使用してください。文字列が必要な場合は、char
の配列を使用してください。
-1から100を保持できる数値変数が必要な場合は、int8_t
いいね。 0から100,000までの値を表す必要がある場合は、 uint32_t
uint_least32_t
(@ Sergeに感謝)は素晴らしい選択です。
Cstdintからtypedefを使用するために need が必要になる特定の状況の1つは、多くのポインターからintへの変換を行うコードを処理する場合です。この場合、intptr_tを使用すると絶対的な要件。
私が働いている会社では、32ビットから64ビットトンの低品質のC/C++コードに移行する準備をしています。これらのコードは、ポインターをintにキャストしてから、ポインターに戻します。これは、64ビットアーキテクチャでは間違いなく失敗します。可能な限りコードをサニタイズし(つまり、データ構造とインターフェイスを変更してキャストの必要性を完全に排除し)、他の場所ではintの代わりにintptr_tを使用します。
ちなみに、キャストは一般的に疑わしいものですが、真剣に、整数へのポインターのキャストは、ほとんどの場合、設計のどこかに重大な欠陥がある結果です。基本的に、intの後ろにポインターを隠すたびに、コンパイラー、プラットフォーム、そしてさらに重要なことに同僚に嘘をつきます。
それ以外は、他の人が言ったように、可能な場合はジェネリック型を使用し、必要な場合は明示的なサイズの型を使用します。
基本的に、uint32_tとunsignedintの間に手がかりがないようです。後でタイプがどのように使用されるかが必ずしもわからないため、これは完全に正常です。
typedefを使用するだけです。
Unsigned intまたはuint32_tが必要かどうかに関係なく(後で考えて、プログラムがどうなるかをより完全に把握できる場合)、typedefを使用すると、実際の内容を指定することでコードを明確にすることができます。操作すると、最初の選択が最悪だった数か月後を把握したときに、別のタイプに簡単に変更できるようになります。あなたは通常それらのことを難しい方法で理解するので、ここには「正しい答え」はありません。 uint32_tが必要なライブラリとintが必要な他のライブラリ間の相互運用は面倒です。