回答編集履歴

1 refine

yohhoy

yohhoy score 6093

2015/09/25 12:16  投稿

> 下のコードでは構造体タグは省略されて、studentオブジェクトを作っているという認識は正しいですか  
いいえ。この時点では「studentオブジェクト(≒値)」は作られていません。  
 
> typedefで文字を省略できるとあったのですが、これはオブジェクトの前にstruct~と書かなくていいという意味ですか?
はい。typedef宣言によって、型名を`struct student`のように書く代わりに、`student`と書けるようになります。
> そんなにたいした文字量を省略しているわけではないと思ったのですが、なぜtypedef stuctを使うのでしょうか
一般論としては、冗長性が少なく短い方がコードを読みやすいでしょ?という考え方です。(とはいえ、好みの問題もありますが)。
---
C言語での「構造体の型名」は、キーワード`struct`も含んだ全体となります。下記コードでは`struct gstudent`が構造体の型名です。
```C
// 構造体 struct gstudent 型を宣言
struct gstudent {
 ~
};
// 構造体型 struct gstudent の 変数 sanaka を定義
struct gstudent sanaka;
// "gstudent"という型名は存在しないため、下記はコンパイルエラー
gstuduent s;
```
一方でtypedef宣言を用いると、ある型に対して別名を付けることが出来ます。
```C
// int型の別名としてMyInteger型を宣言
typedef int MyInteger;
// MyInterger 型の変数 v を定義
MyInteger v;
```
質問文にある`typedef struct { ~ } student;`では、無名の構造体の宣言 + typedefによる別名の宣言 を同時に行っています。
```C
// 無名の構造体型を宣言し、その別名として student 型を宣言
typedef struct {
 ~
} student;
// 構造体型 student の 変数 sanaka を定義
student sanaka;
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る