typedef というキーワードで、プログラマが型に名前を付けて使うことができます。
(ソースの定義位置から、ソースファイルの最後まで有効で、名前を重複して定義することはできません)
一般的な書式は次の通りです。
typedef
既存の型
新しい型名
;
これは、既存の型に、別の名前を付けていることになります。以下でいくつかの例を示します。
typedef int Integer; Integer r = 123;/* 整数記憶用に、Integerの型が使えるようになります */
なお、 新しい型名のスコープは 変数の名前と同じで、関数内で定義した場合は、その関数の中だけで使えるローカル なものになり、関数の外側で付けた名前は、そのソースファイル内の定義位置以降で使える 名前になります(ファイルスコープと言います)。 ファイルスコープの名前を、ローカルで再び定義できますが、 関数の外側で再定義することはできません。
次のように配列宣言子やポインタ宣言子を利用した定義も可能です。
typedef char String[256]; typedef int * Pointer; String s = "abcdefg"; /* s は、256個のchar型配列で、それを初期化して用意したことになります */ Pointer p = NULL; /* p は(int *)型のポインタ変数でNULLで初期化しています。 */
sizeof演算子で、オペランドに型を指定するとその型のバイト数が得られますが、 上記のString型について、sizeof(String)と表現すると、結果に255のbyte数が得られます。
次のように、構造体定義に対しても 使えます。
struct data_t { char name[STRMAX]; int idata; }; typedef struct data_t Data; Data a, b; /* a と b は、構造体 struct data_t型の変数になります。Data型 */
なお、次のように、構造体定義を行いながらtypedefを使うこともできます。
この場合、構造体タグ名を省略しても、別の位置で変数定義が可能になります。
下記例と上記例の変数 a と b は、同じ構造の変数になります。
typedef struct { char name[STRMAX]; int idata; } Data; Data a, b; /* a と b は、構造体 struct data_t型の変数になります。 */
なお ほとんどのコンパイラでは、
ファイル操作を行う時に使う FILE 型(fopen戻り値の型)を、
stdio.hの中でtypedefにより定義しています。
これにより 、ファイル操作で使う構造体のstruct を使わないで、 FILE * fpr;などの宣言ができるようになっています。