導入
struct Point p; のように、変数を作るたびに struct を書くのは面倒です。C言語には、型に別名をつける typedef があり、これを使うと struct を省略して Point p; と書けるようになります。
説明
typedef struct { ... } 別名; の形で、構造体の定義と同時に別名をつけるのが定番の書き方です。
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
int main(void) {
Point p = {3, 4}; // struct を書かなくてよい
printf("(%d,%d)\n", p.x, p.y);
return 0;
}
flowchart LR a["struct Point p;<br/>(typedefなし)"] -.->|"typedefで別名をつける"| b["Point p;<br/>(毎回structを書かなくていい)"]
すでに struct タグ名 が別にある場合は、typedef struct タグ名 別名; の形で後から別名をつけることもできます。この形は、次の第8章で自分自身を指すポインタを持つ構造体(連結リスト)を作るときにも使います。
struct Node {
int value;
struct Node *next;
};
typedef struct Node Node; // struct Node に Node という別名をつける
やってみよう
Point を使って、別の座標の値を持つ変数をもう1つ作って表示してみましょう。typedef を外して struct Point に戻すとどうなるかも確かめてください(コンパイルエラーになります)。
演習
typedef struct { double radius; Point center; } Circle; のように、Point をメンバに持つ Circle を typedef で定義してください。center = {0, 0}、radius = 5.0 の値を持つ変数を作り、printf("radius=%.1f\n", c.radius); で「radius=5.0」と表示してください。
ヒント1を見る
Circle の定義は Point の定義より後に書きます(Point を先に使うため)。
ヒント2を見る
初期化は Circle c = {5.0, {0, 0}};(メンバの順番どおり)で書けます。