2015年6月4日木曜日

struct 五段活用

久々に C 書くと毎度ごっちゃになるので整理しておく。

基礎知識

変数の宣言

 変数名

typedef の宣言

typedef 別名

構造体の定義

struct 構造体名 定義

1. 標準型

struct mystruct {
  int foo;
};
struct mystruct bar;

おそらく一番オーソドックスな使い方。
構造体だからと言って盲目的に mystruct_t と _t を付ける人もいるが、"struct mystruct" 全体が型名なので、個人的にはいちいち _t を付けなくても構造体であることは明示されていると思う。

2. typedef 型

typedef struct {
  int foo;
} mystruct_t;
mystruct_t bar;

いちいちstructを付けるのが面倒くさいときによくやるやり方。
無名の構造体を定義して、それに対して typedef で新しい名前を与えている。
この場合は型名に struct が付かないので、_t を付けるべき。

3. 混合型

typedef struct mystruct {
  int foo;
} mystruct_t;
struct mystruct bar;
mystruct_t buz;

今度は struct mystruct という構造体の定義と、それに対して mystruct_t という別名を付けるのを同時に行っている。
最初に読んだ C の教科書にこう書かれていたためか、昔は盲目的にこう書いていたが、どっちかに統一すればいいだけの話なのであんまり意味ないのよね。

4. トリッキー型

struct {
  int foo;
} bar;

一見 2 と似ているが、typedef の有無で全く意味が異なる。
こちらでは、無名の構造体を定義すると同時に、その型の変数 bar を宣言している。
型名がないので関数の引数にも何にも出来ないが、グローバル変数を構造体に纏めておきたいときや、union や 構造体の中で入れ子にしたいときなど名前を付ける必要の無いときには便利。しかし、typedef の付け忘れと見分けが付きにくいので使いどころに気をつけた方が良い。

5. ものぐさ型

struct mystruct {
  int foo;
} bar;
struct mystruct buz;

3 と 4 に近いが、こちらは struct mystruct という構造体を定義すると同時に、その型の変数 bar を宣言している。
性質の異なる複数のことを同時に行うのは混乱のもとなので個人的にはおすすめしない。
4 と同じく typedef の付け忘れと混同されないように注意が必要というか、typedef を付け忘れたけどよくわからんがとりあえず "struct mystruct" の方が使えるから良いかということで放置されているケースの方が多い気がする。

0 件のコメント:

コメントを投稿