web-dev-qa-db-ja.com

int32_tの「t」は何を意味していますか?

Cで、uint8_tint32_tのような整数型の最後にtがある場合、どのような意味がありますか?それはどこから来たのですか?タイプがint32と呼ばれていないのはなぜですか?

10
ahalekelly

_tで終わるすべての識別子は、将来の追加のタイプのために予約されているためです。

int32_tファミリーのタイプはC99標準で追加されたため、既存のソフトウェアとの競合を避けるために予約名を使用しました。

予約済みの名前の概要 glibcのドキュメント をご覧ください。


注意:
MicrosoftはC標準委員会ではないため、_tファミリの名前を使用せず、代わりに予約されていないINT32を選択するのが適切です。

C99標準が承認された時点では、int32を識別子として使用するCプログラムがすでに無数に存在していました。 intlongの両方が32ビットであるプラットフォームでは、既存のコードの一部はint32intとして定義し、一部はlong(後者はintが16ビットでlongが32ビットであるプラットフォームとの互換性を許可します;前者はintが32ビットでlongが64であるプラットフォームとの互換性を許可します)。コンパイラが「int」と「long」を両方とも32ビットで表現が一致するプラットフォームで同義語として許可することは理にかなっているかもしれませんが、その場合、「新しい」int32型は両方と互換性があり、標準それを許可していません。

int32intと同義であることがわかっているプラ​​ットフォーム用に書かれたコードは、int*int32*を互換的に使用できます。 int32longと同義であることがわかっているプラ​​ットフォーム用に書かれたコードは、int32*long*を互換的に使用できます。ただし、intlongの両方が同じ表現を持つプラットフォームでも、キャストせずにint*long*に、またはその逆に変換しようとすると、標準でプラットフォームが不規則になります。

さらに、intlongが同じ表現を持つプラットフォームでも、int*long*にキャストしても、long*として使用できるポインターを生成する必要はありません。 gccの現在のメンテナーは、標準ではそのようなキャストが機能することを要求していないため、コンパイラーは、そのようなキャストが失敗する場合があるコードを生成する必要があると考えています。

したがって、C99がint32ではなくint32_tを使用した場合、その識別子をintとして定義するコードを中断し、intと同義であるか、またはそれを定義するコードを予測する必要がありました。 longとしての識別子であり、longと同義であることが期待されます。

8
supercat

_tデータ型はstdint.hヘッダーのtypedef型ですが、intはCへの組み込み基本データ型です。_tデータ型は、stdint.hが存在する場合にのみ使用できます。ただし、intのような基本的なデータ型は存在することが保証されています。

基本的に、それはほとんど何も意味しません。 Cが名前を付けることを決めたのはまさにそのためです。

4
Lawrence Aiello

size_tは「サイズタイプ」として読み取られます

_tは通常タイプを意味し、時にはtypedefを意味します。

なぜ型は単にint32と呼ばれなかったのですか?

そのため、組み込み型と区別できる可能性があります。stdint.hは、プラットフォームに応じて、適切な組み込み型を指定されたサイズに選択することになっています。 N.b.一部のコンパイラint32_tは、i_32などのコンパイラ固有の表記をエイリアス化します。

Microsoftは別のアプローチを採用し、その標準はINT32、DWORDなどの値を持つ#definesに基づいています。

3
esoterik