C言語の構造体をtypedefする方法

513, 2022-07-07

目次

C言語の構造体をtypedefする方法

C言語では構造体を使えますが構造体はtypedefすることができます。
構造体をtypedefすると構造体型として新しい型を定義できます。

結論を言うと構造体のtypedefは↓のようにします。

typedef struct {
    int age;
} Animal;

この記事では構造体のtypedefについて詳しく解説します。

関連記事

構造体の宣言方法

構造体を宣言する方法についておさらいしておきます。
構造体は↓のフォーマットで宣言します。

struct 構造体名 {
    メンバ変数;
};

たとえばAnimalという構造体を宣言するには↓のようにします。

struct Animal {
    int age;
};

この構造体を使って構造体変数を作る場合は↓のようにします。

struct Animal animal = { 20 };

構造体変数を定義する場合は↑のように変数の宣言にstruct Animalを付ける必要があります。
このような宣言は冗長で書くのがめんどくさい場合があります。
そういう時は型を定義すると短く書けます。

構造体をtypedefして新しい型を作る

構造体のtypedefにはバリエーションがあります。
1つずつ紹介します。

タグ名と型名を一緒に宣言する

まず1つ目が↓のような定義方法です。

typedef struct 構造体タグ名 {
    メンバ変数;
} 構造体型名;

↑のようにstructの頭にtypedefを付けると型を定義できます。
↑の定義は構造体のタグ名と型名を同時に定義しているところです。

コードにすると↓のようになります。

typedef struct _Animal {
    int age;
} Animal;

この定義だと↓のような変数定義が可能になります。

struct _Animal a = { 20 };  // タグで定義
Animal b = { 30 };  // 型で定義

構造体では自己参照構造体というものを使うことがあります。
これはリンクリストなどで使われます。
その場合は場合によっては構造体タグ名でメンバ変数を定義する必要があるので、タグ名もよく使われます。

タグ名を省略する

次にタグ名を省略する書き方です。
タグ名を省略して型だけ定義するには↓のようにします。

typedef struct {
    メンバ変数;
} 構造体型名;

コードにすると↓のようになります。

typedef struct {
    int age;
} Animal;

この構造体型は↓のように使うことができます。

Animal a = { 20 };

構造体の宣言から型を宣言する

構造体の定義(メンバ変数など)を省略して構造体タグ名から型を宣言する場合は↓のようにします。

struct 構造体タグ名;
typedef struct 構造体タグ名 構造体型名;

コードにすると↓になります。

struct _Animal;
typedef struct _Animal Animal;

この宣言では構造体のメンバは定義していません。
ですので変数の定義はできません。
構造体のメンバを定義すれば定義できます。

struct _Animal;
typedef struct _Animal Animal;

struct _Animal {
    int age;
};

int main(void) {
    Animal a = {20};
    return 0;
}

二重定義エラー

typedefは異なった定義の構造体を同じ型で宣言しようとするとエラーになります。

struct _Animal;
struct _Human;

typedef struct _Animal LifeForm;
typedef struct _Human LifeForm;

GCCではコンパイル時に↓のようなエラーが出力されます。

error.c:5:23: error: conflicting types for ‘LifeForm’
    5 | typedef struct _Human LifeForm;
      |                       ^~~~~~~~
error.c:4:24: note: previous declaration of ‘LifeForm’ was here
    4 | typedef struct _Animal LifeForm;
      |                        ^~~~~~~~

confliction typesというのはつまり型が衝突しているということです。
定義の異なるデータを同じ型で宣言することはC言語ではできないのでエラーになります。

おわりに

今回はC言語の構造体のtypedefについて解説しました。
構造体のtypedefは非常によく行われます。
typedefして楽をすると吉です。

(^ _ ^)

型を定義しよう

(・ v ・)

片っ端から型宣言



この記事のアンケートを送信する