_t (アンダースコア-t) が後に続く型は何を表しますか?

Douglas Mayle が指摘したように、これは基本的に型名を示します。したがって、変数名または関数名を '_t で終了することはお勧めできません。 ' 混乱を招く可能性があるためです。 size_t と同様 、C89 標準は wchar_t を定義します 、 off_tptrdiff_t 、そしておそらく私が忘れた他のいくつか。 C99 標準では、 uintptr_t など、多くの追加の型が定義されています 、 intmax_tint8_tuint_least16_tuint_fast32_t 、 等々。これらの新しい型は <stdint.h> で正式に定義されています しかし、ほとんどの場合 <inttypes.h> を使用します <stdint.h> を含む (標準 C ヘッダーでは珍しい) .それ (<inttypes.h> ) printf() で使用するマクロも定義します。 と scanf() .

Matt Curtis が指摘したように、サフィックスにはコンパイラにとって意味はありません。それは人間志向の慣習です。

ただし、POSIX では「_t」で終わる追加の型名が多数定義されていることにも注意してください。 '、サフィックスを予約 実装のために。つまり、POSIX 関連のシステムで作業している場合、規則に従って独自の型名を定義することはお勧めできません。私が取り組んでいるシステムはそれを (20 年以上) 行ってきました。私たちは、定義したのと同じ名前の型を定義するシステムに定期的につまずきます。


typedef など、データ型の命名規則です。 :


typedef struct {
  char* model;
  int year;
...
} car_t;


_t 通常、不透明な型定義をラップします。

GCC は _t で終わる名前を追加するだけです 標準 C および POSIX (GNU C ライブラリ マニュアル) の将来のバージョンとの競合を避けるために、使用しない予約済みの名前空間に変更します。いくつかの調査の後、私は最終的に POSIX 標準 1003.1 内の正しい参照を見つけました:B.2.12 データ型 (ボリューム:理論的根拠、付録:B. システム インターフェイスの理論的根拠、章:B.2 一般情報):

一言で言えば、標準は標準タイプのリストを拡張する可能性が高いと述べているため、標準は _t を制限しています 独自の使用のための名前空間。

たとえば、プログラムは POSIX 1003.1 Issue 7 に一致します タイプ foo_t を定義しました . POSIX 1003.1 Issue 8 最終的には新しく定義されたタイプ foo_t でリリースされます .プログラムが新しいバージョンと一致していないため、問題が発生している可能性があります。 _t の制限 使用すると、コードのリファクタリングが妨げられます。したがって、POSIX 準拠を目指すのであれば、_t は絶対に避けるべきです。 規格に記載されているとおりです。

補足:個人的には POSIX に固執するようにしています。さらに、私は Linux Coding Style (第 5 章) のガイドラインがとても好きです。 typedef を使用しない正当な理由がいくつかあります。これが役に立てば幸いです!