第30回
データ構造(9)~構造体の基本

型の別名を定義する~typedef記憶クラス指定子

一度定義した構造体をソース中で何度も使いたい場合は、構造体に明快で分かりやすい名前を付けておく方が便利です。そのような場合によく用いられるのが、typedef命令による『別名の定義』です。

構造体に型名を充てる

typedef命令は「記憶クラス指定子」あるいは「型定義指定子」と呼ばれ、以下のような書式で型に別名を定義します。
typedef <型> <別名>;

これを利用して、先の構造体に“s_staff”という別名を定義するなら、以下のように記述します。
struct _staff{
  int    id;
      : (略)
};
typedef _struct _staff s_staff;

構造体の定義と型名の定義をまとめる

さらに、上の2つの構文を1つにまとめてタグを省略し、次のように記述するとすっきりします。
typedef struct {
  int    id;
  char   name[64 + 1];
  int    gender;
  char   birth[10 + 1];
  int    sect;
} s_staff;

最後の“s_staff”が構造体に付けられた別名です。これで、s_staff型の変数を以下のように宣言できます。
s_staff stf;

typedef命令は、同じく文字列に別名を充てる#defineと似ています。しかし、#defineがコンパイラの前にソースを処理するプリプロセッサに備わった命令であるのに対して、typedefはCの機能として備わっている命令です。

また、#defineは「ソース中に表れる文字列Aを文字列Bに置き換える」という機能を持っているため、数値定数や文字列定数をわかりやすい名前で扱う際に多用されますが、typedefの機能は「型を別名で扱う」ことなので、構造体のような複雑な定義の型を単純な名前で扱う際に用います。