タグ付きの構造体

構造体指定子では structキーワードの後に、宣言する構造体の名前を設定できます。この名前を、構造体のタグと呼びます。タグは、構造体の内容を表すもので、一度宣言された構造体を後で再利用できます。

struct Point { int x, y; }  ;

上記の宣言は、int型のメンバ x と y を持つPointという名前の構造体を宣言しています。同時に変数を宣言することもできますが、再利用を前提とした構造体のタグを宣言することが目的であれば、変数は省略しても構いません。タグを指定して、直後の波括弧によるメンバ宣言並び { } が省略されている宣言は、指定されたタグを持つ構造体の宣言として解釈されます。

struct Point pt;

上記の変数ptは、既に宣言されているPoint構造体として解釈されます。何度も利用する構造体の場合、最初に構造体の内容を含むタグを宣言することで、それ以降は構造体の内容を省略して変数を宣言できます。

Sample02

#include <stdio.h>

int main(void)
{
    struct Point { int x, y; };
    struct Point pt1;
    struct Point pt2;

    pt1.x = 10;
    pt1.y = 20;

    pt2.x = 100;
    pt2.y = 200;

    printf("pt1.x=%d, pt1.y=%d\n", pt1.x, pt1.y);
    printf("pt2.x=%d, pt2.y=%d\n", pt2.x, pt2.y);

    return 0;
}

実行結果

Sample02の実行結果

Sample02は、int型のメンバ x と y を持つ Point構造体を宣言しています。最初のPoint構造体の宣言は、構造体のタグを宣言することが目的なので、変数は宣言していません。その後、宣言されたPointタグを使って構造体の内容を省略してpt1変数とpt2変数を宣言しています。実行結果を見れば、これらの変数が正しくPoint構造体の x メンバと y メンバを保持していることを確認できます。