Typedef
データ型の改良あるいは変更が必要になるときに、必要な変更はただ1つだけのtypedefの宣言箇所であり、typedefシノニムを利用してさえいれば多くの箇所を変更する必要がなくなる。第二に、データを隠すことに加えて、データのカプセル化も向上させるようになり、複雑な宣言がより理解しやすくなることである。
もともとC言語の規格では、基本型(intなどの組み込み型)のサイズや内部表現を厳密に規定しておらず、処理系依存となっている(ターゲット プラットフォームにとって都合の良いサイズや内部表現に設定してよいことになっている)ため、プラットフォーム間の違いを吸収して同じソースコードを使うためにはtypedefは必須の技術といえる。C99/C++11規格では、int32_tなどのサイズや内部表現を保証する整数型が<stdint.h>/<cstdint>にて標準化されたが、これらは通例typedefシノニムを利用して実装される。とはいえ、エイリアスによる型定義は万能ではなく、汎整数拡張などのように組み込み型にまつわる問題は依然として残っている。
Microsoft WindowsにおけるWindows APIの例でいうと、Win16とWin32におけるint型の違いを吸収できるINT32型がエイリアス定義されている。また、Win16、Win32、Win64におけるポインタ互換整数型の違いを吸収できるINT_PTR型がエイリアス定義されている。
まずtypedefを使わない例を示す。
この関数は入力xが偶数であれば1を、奇数であれば0を返す。しかし、次のようにint型の別名として論理型(ブーリアン型)を定義し、関数の戻り値の型の名前として使用することで、戻り値の意味を明確化できる。
真偽値 (boolean) は通例0を偽、0以外を真とすることから、関数の仕様がより明確となっている。
また、typedefは長大で複雑な型名を単純化するために用いられることもある。
次に、構造体を使った例を示す。
ここでは、ユーザー定義の型my_structが定義されている。my_struct型の変数を宣言するために、C言語では以下のようにstructキーワードが必要である。
ここで、構造体宣言の後に、以下の行を追加してみる。
これにより、my_struct型の変数を宣言するためには、以下のコードで十分となる。
同じことは、以下のコードでも行うことができる。
構造体のタグ名を省略することもできる。この場合、タグ名は処理系によって自動生成される。
構造体のタグ名と別名を同一にすることもできる。
以上のtypedef活用は構造体だけに限らず、共用体unionや列挙型enumの定義時にも同様に適用可能である。
typedefは、自己参照構造体へのポインタの作成を簡単にすることもできる。