Cで、uint8_t
やint32_t
のような整数型の最後にt
がある場合、どのような意味がありますか?それはどこから来たのですか?タイプがint32
と呼ばれていないのはなぜですか?
_t
で終わるすべての識別子は、将来の追加のタイプのために予約されているためです。
int32_t
ファミリーのタイプはC99標準で追加されたため、既存のソフトウェアとの競合を避けるために予約名を使用しました。
予約済みの名前の概要 glibcのドキュメント をご覧ください。
注意:
MicrosoftはC標準委員会ではないため、_t
ファミリの名前を使用せず、代わりに予約されていないINT32
を選択するのが適切です。
C99標準が承認された時点では、int32
を識別子として使用するCプログラムがすでに無数に存在していました。 int
とlong
の両方が32ビットであるプラットフォームでは、既存のコードの一部はint32
をint
として定義し、一部はlong
(後者はint
が16ビットでlong
が32ビットであるプラットフォームとの互換性を許可します;前者はint
が32ビットでlong
が64であるプラットフォームとの互換性を許可します)。コンパイラが「int」と「long」を両方とも32ビットで表現が一致するプラットフォームで同義語として許可することは理にかなっているかもしれませんが、その場合、「新しい」int32
型は両方と互換性があり、標準それを許可していません。
int32
がint
と同義であることがわかっているプラットフォーム用に書かれたコードは、int*
とint32*
を互換的に使用できます。 int32
がlong
と同義であることがわかっているプラットフォーム用に書かれたコードは、int32*
とlong*
を互換的に使用できます。ただし、int
とlong
の両方が同じ表現を持つプラットフォームでも、キャストせずにint*
をlong*
に、またはその逆に変換しようとすると、標準でプラットフォームが不規則になります。
さらに、int
とlong
が同じ表現を持つプラットフォームでも、int*
をlong*
にキャストしても、long*
として使用できるポインターを生成する必要はありません。 gccの現在のメンテナーは、標準ではそのようなキャストが機能することを要求していないため、コンパイラーは、そのようなキャストが失敗する場合があるコードを生成する必要があると考えています。
したがって、C99がint32
ではなくint32_t
を使用した場合、その識別子をint
として定義するコードを中断し、int
と同義であるか、またはそれを定義するコードを予測する必要がありました。 long
としての識別子であり、long
と同義であることが期待されます。
_tデータ型はstdint.hヘッダーのtypedef型ですが、intはCへの組み込み基本データ型です。_tデータ型は、stdint.hが存在する場合にのみ使用できます。ただし、int
のような基本的なデータ型は存在することが保証されています。
基本的に、それはほとんど何も意味しません。 Cが名前を付けることを決めたのはまさにそのためです。
size_tは「サイズタイプ」として読み取られます
_tは通常タイプを意味し、時にはtypedefを意味します。
なぜ型は単にint32と呼ばれなかったのですか?
そのため、組み込み型と区別できる可能性があります。stdint.hは、プラットフォームに応じて、適切な組み込み型を指定されたサイズに選択することになっています。 N.b.一部のコンパイラint32_tは、i_32などのコンパイラ固有の表記をエイリアス化します。
Microsoftは別のアプローチを採用し、その標準はINT32、DWORDなどの値を持つ#definesに基づいています。