Typedef
typedef（タイプデフ）は、プログラミング言語のCおよびC++におけるキーワード（予約語）である。このキーワードはデータ型に新しい名前（エイリアス、シノニム）をつけるために使用される。プログラマが容易にソースコードを記述・理解できるようにすることが目的である。
まずcodice_1を使わない例を示す。
この関数は入力codice_2が偶数であれば1を、奇数であれば0を返す。しかし、次のようにcodice_3型の別名として論理型（ブーリアン型）を定義し、関数の戻り値の型の名前として使用することで、戻り値の意味を明確化できる。
真偽値 (boolean) は通例0を偽、0以外を真とすることから、関数の仕様がより明確となっている。
また、typedefは長大で複雑な型名を単純化するために用いられることもある。
次に、構造体を使った例を示す。
ここでは、ユーザー定義の型codice_4が定義されている。codice_4型の変数を宣言するために、C言語では以下のようにcodice_6キーワードが必要である。
ここで、構造体宣言の後に、以下の行を追加してみる。
これにより、codice_4型の変数を宣言するためには、以下のコードで十分となる。
同じことは、以下のコードでも行うことができる。
構造体のタグ名を省略することもできる。この場合、タグ名は処理系によって自動生成される。
構造体のタグ名と別名を同一にすることもできる。
以上のcodice_1活用は構造体だけに限らず、共用体codice_9や列挙型codice_10の定義時にも同様に適用可能である。
typedefは、自己参照構造体へのポインタの作成を簡単にすることもできる。以下にコード例を示す。
通常、ある型のポインタ型変数を宣言する際、それぞれの変数名の前にアスタリスクcodice_11を記述する必要がある。
プログラマはcodice_12がポインタ型codice_13であることを想定しているが、typoによりcodice_12は値型codice_15であると定義されてしまっている。これは微妙な構文エラーを引き起こす。
新たにcodice_13型を定義することでこのような記述ミスを回避できる。以下のコードがその例である。
これにより、codice_12を含めて全ての変数がcodice_13型であることが保証される。
関数へのポインタを利用する場合も codice_1 を利用することで可読性を向上できる可能性がある。
なお、上記は以下のようにも書ける。
配列に対して codice_1 を利用することもできる。
なお、以下のようなコードに対する動作は未定義となる。グローバルスコープを持ち、アンダースコアcodice_21で始まる識別子、もしくはcodice_21で始まり、その次が大文字の識別子は予約済み識別子であり、それを宣言または定義した場合は動作未定義とされているからである。
C/C++にはテキストの置換機能としてマクロも備わっているが、型名の置換に使うには問題がある。まず、ポインタ型を正しく扱えない。
typedefであればポインタ型を正しく扱える。
また、マクロは乱暴な置換を行なうことから、意図しない置換による原因特定のしにくいコンパイルエラーを引き起こすこともある。
C言語と異なり、C++において構造体、共用体、列挙型、クラス型の変数を宣言する際は、codice_6、codice_9、codice_10、codice_26キーワードの使用はオプションとなっており、あいまいさがないかぎり省略できる。例えば、
という定義さえあれば、codice_1エイリアスを明示的に定義したり、codice_6キーワードを明示的に使用したりせずとも、
と宣言できる。
C++ではクラス（あるいは構造体）内部でcodice_1を使用することで、クラス スコープのシノニムを定義することができるため、テンプレートを使用したジェネリックプログラミングやダックタイピングに都合がよい。C++標準ライブラリのSTLの実装では、このテクニックが利用されている。
C++ではcodice_1をC言語同様にエイリアス宣言のために利用できるが、C++11ではcodice_31キーワードによる文法も追加された。
C++11では、上記は以下のようにも書ける。
なお、codice_1はテンプレート化できないが、C++11ではcodice_31によるエイリアステンプレートが追加された。
一部の人々は、codice_1を広範に使用することに反対している。ほとんどの議論は、codice_1は単に変数の実際のデータ型を隠すだけであるという考えに集中する。例えば、Linuxカーネルハッカーであり、ドキュメント作成を行っているグレッグ・クロー＝ハートマン（Greg Kroah-Hartman）は、関数プロトタイプ宣言を除いて、codice_1の使用をやめさせようとしている。彼は、codice_1を使用することが、必要以上にコードを混乱させるだけでなく、プログラマが巨大な構造体を単純な型と誤認識して使用してしまうことがあると主張している。
しかし、codice_1を推奨して、広範に使用することに大賛成する人々もいる。特に、C言語を発明したブライアン・カーニハン (Brian W. Kernighan) とデニス・リッチー (Dennis M. Ritchie)はプログラミング言語C（英：）というC言語の定義書に、codice_1の利用に対するメリットを2つ述べている。まず第一は、ソフトウェアをマルチプラットフォーム展開する際に、ソースコードの移植性（ポータビリティ）を向上させる手段として重要なことである。データ型の改良あるいは変更が必要になるときに、必要な変更はただ1つだけのcodice_1の宣言箇所であり、codice_1シノニムを利用してさえいれば多くの箇所を変更する必要がなくなる。第二に、データを隠すことに加えて、データのカプセル化も向上させるようになり、複雑な宣言がより理解しやすくなることである。
もともとC言語の規格では、基本型（codice_3などの組込型）のサイズを厳密に規定しておらず、処理系依存となっている（ターゲット プラットフォームにとって都合の良いサイズに設定してよいことになっている）ため、プラットフォーム間の違いを吸収して同じソースコードを使うためにはcodice_1は必須の技術といえる。C99/C++11規格では、サイズ保証の整数型が/にて標準化されたが、これらは通例codice_1シノニムを利用して実装される。
Microsoft WindowsにおけるWindows APIの例でいうと、Win16とWin32におけるcodice_3型の違いを吸収できるcodice_46型がエイリアス定義されている。また、Win16、Win32、Win64におけるポインタ互換整数型の違いを吸収できるcodice_47型がエイリアス定義されている。
Haskell、Miranda、Objective Caml等のような、多くの静的型付けの関数型言語では、C言語でのcodice_1と同じ働きをする、"type synonym"を定義することができる。Haskellでの例を示す。
これにより、codice_49のペアと同じものをtype synonymのcodice_50で定義することができる。
PascalおよびObject Pascalではcodice_51キーワードを使用することで、codice_1同様に別名を定義することができる。
C/C++の特徴を取り入れたC#言語では、基本型のサイズは厳密に決められており、またcodice_1は言語機能として存在しないが、代わりにcodice_31エイリアス ディレクティブ機能が存在する。