No.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 はダメということになります.
No.2
- 回答日時:
「2は型を定義していないことにはならないのでしょうか?」というのは, なにをどう考えてそう思ったのでしょうか?
この回答へのお礼
お礼日時:2018/11/21 00:24
すみません、おそらく自分の勘違いですが、struct の直後に来るのが型でメンバーの後に来るのが新しい構造体の名前だと思っていて、なので2はstructの後に型がこないので定義していないのではないかと思いました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- 中学校受験 車の免許の学科試験2回すべりました。。。 1 2022/12/07 23:54
- 工学 西洋の教会の鐘で巨大な鐘を揺らして鳴らすのは、物理的にどんなメリットがあるの? 9 2022/12/13 08:46
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- AI・ロボット AI論 3 2023/05/20 13:16
- お酒・アルコール お酒が強い人って元々強いんですか? それとも最初はお酒に弱くて鍛えて強くするんですか? 1 2023/02/10 21:52
- 教育学 勉強している時に使うノートについて。 私は同じ科目の勉強でも継続して同じノートに書く癖がなく 違うノ 1 2023/05/19 04:28
- その他(芸術・クラフト) 女性の身体の描き方について 5 2023/07/27 16:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
C++ 構造体の一括初期化 {0}
-
「#undef」と「#define」の使い...
-
Integer変数をカラにしたいので...
-
構造体のデータを丸ごとコピー...
-
VBAにてcolorindexを変数に格納...
-
変数の初期化について
-
VB6.0の変数、関数の定義位置か...
-
命名規則 VB 構造体
-
typedefをプログラム中で解除す...
-
関数の引数の順番の混乱を回避...
-
long型のデータをバイト型の配...
-
VBAのコードで Dim Obj As Acce...
-
10進数の変換方法
-
VB.NETのStructureというのはど...
-
C言語 構造体の中に共用体を定...
-
ユーザー定義型変数の一括初期化
-
構造体の継承?再定義?
-
セグメントエラー
-
配列を使わずに、変数名を動的...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
C++ 構造体の一括初期化 {0}
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
VBAにてcolorindexを変数に格納...
-
long型のデータをバイト型の配...
-
構造体のデータを丸ごとコピー...
-
構造体のポインタにNULLが入らない
-
VBAの変数のデータ型を変更する...
-
異なる構造体のデータのコピー
-
ユーザー定義型変数の一括初期化
-
構造体の初期化方法について
-
typedefをプログラム中で解除す...
-
C言語 構造体の中に共用体を定...
-
charとucharの違い
-
日付チェック関数について
-
整数から16進数への変換 現在c...
-
値が代入されてない時
-
命名規則 VB 構造体
-
構造体にする理由・利点・使用例
おすすめ情報