プロが教える店舗&オフィスのセキュリティ対策術

構造体の勉強をしているのですが1と2は同じなのでしょうか?違うのでしょうか?
もし違うならなぜ違うのか説明してください‼︎
よろしくお願いします。

1.typedef struct roll{メンバー};

2.typedef struct {メンバー}roll;

A 回答 (3件)

「struct の直後に来るのが型でメンバーの後に来るのが新しい構造体の名前」の「型」と「構造体の名前」の違いってなんだろ.



さておき, これは typedef の仕様との関係がありますねぇ.

まず構造体の定義を完全に書くと
struct 構造体タグ メンバー定義 宣言子;
という形になります. ここで構造体タグは識別子, メンバー定義は
{ メンバーの宣言 }
という形で宣言子は変数やら配列やらポインタやらを表します. struct 以外は省略可能なのですが, 実際に意味を持つのは
・宣言子を省略する: 「struct 構造体タグ」で表される新しい構造体を定義する
・メンバー定義を省略する: 「struct 構造体タグ」で表される構造体型の変数などを宣言する
・構造体タグを省略する: 構造体タグがなんらかの理由で不要なときにはこの形式もあります
・メンバー定義と宣言子を省略する: 「struct 構造体タグ」で表される構造体型があることを宣言する
の 4つに限られます (全部省略しちゃダメなのは明らかだと思うけど). 再度確認しておくと, 「struct 構造体タグ」で 1つの型を表します.

質問文にある 2つの文を (typedef を除いて) 解釈するとそれぞれ
1. 宣言子を省略している. roll が構造体タグで, 「struct roll」という型を定義する
2. 構造体タグを省略している. roll は宣言子で, この場合は roll という変数を宣言する
となります. そして, *typedef がなければ*どちらも合法です (ただし, 当然ですが意味は違います).

で typedef の影響が出ます. typedef は
宣言子に含まれる識別子に対し, 「typedef がなければ与えられるはずの型」の別名として定義する
という働きをもちます. 例えば
int FOO, *Bar;
だと
・FOO は int型の変数
・Bar は int へのポインタ型の変数
なので, ここに typedef を付けた
typedef int FOO, *Bar;
では
・FOO は int型の別名
・Bar は int へのポインタ型の別名
となります. このように typedef では「別名を定義する」都合上, 宣言子はどうしても必須となります. 従って, 宣言子が省略された 1 はダメということになります.
    • good
    • 0
この回答へのお礼

丁寧に説明していただきありがとうございます。理解できました‼︎

お礼日時:2018/11/21 13:56

「2は型を定義していないことにはならないのでしょうか?」というのは, なにをどう考えてそう思ったのでしょうか?

    • good
    • 0
この回答へのお礼

すみません、おそらく自分の勘違いですが、struct の直後に来るのが型でメンバーの後に来るのが新しい構造体の名前だと思っていて、なので2はstructの後に型がこないので定義していないのではないかと思いました

お礼日時:2018/11/21 00:24

1の書き方ってエラーになるのでは?


というのは、typedef って、既にある型に対して新しい名前を作成するものですよね?
1のような書き方だと、型を定義しただけで、新しい名前を指定していないから。
2の書き方は、構造体を定義して、別名のrollを指定しているので正しい。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
その考えで言ったら2は型を定義していないことにはならないのでしょうか?

お礼日時:2018/11/20 23:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!