ページ 11

構造体

Posted: 2007年9月12日(水) 21:30
by Shera
初めまして
夏から勉強を始めたのですが


シューティングの館の4節に

typedef struct{
    double x,y;
    int status,counter;
    int shot [11][15];
} BODY_player_t;

BODY_player_t Player;

とありますが
自分で調べたところ、構造体は

struct ~

で書き出すとありましたが

これはどちらで書いても大丈夫と解釈していいんでしょうか?

Re:構造体

Posted: 2007年9月12日(水) 21:36
by tk-xleader
この場合、structをつけるとエラーになります。なぜなら、structの後に宣言するのはタグ名ですが、
typedef struct{…
の書き方の場合は、タグ名のない構造体型に、名前をつけているという意味になるので、
structをつけずに宣言するのです。

Re:構造体

Posted: 2007年9月12日(水) 22:04
by box
> typedef struct{
>         double x,y;
>         int status,counter;
>         int shot [11][15];
> } BODY_player_t;

これは、x, y, status, counter, そしてshotというメンバーを持つ
構造体に、BODY_player_tという別名を付けている、という意味です。
これ以降は、くだんの構造体をBODY_player_t型として扱えるようになります。

> BODY_player_t Player;

これが、BODY_player_t型の変数Playerの定義です。

Re:構造体

Posted: 2007年9月12日(水) 22:33
by Shera
お早い返信ありがとうございます
あのあと typedef
について調べたところ

>>構造体では、頭に「struct」が付くのでどうしても型名が長くなります。そのため、構造体の宣言を簡潔にするために、typedef は非常に多く用いられます

とありました

また上のお二方の内容からしますと
4節の記述は

typedef struct 以降の {} のなかの内容は =BODY_player_t Player

であっているんでしょうか?

Re:構造体

Posted: 2007年9月12日(水) 22:57
by tk-xleader
要は、構造体とはプログラミングをする人が作る新たな型なのです。その型の名前を、typedefで
つけるということなので、ほぼ同意としてもあまり問題は起きません。もっと簡単に言うと、

typedef int seisuu; /*整数の型であるint型にseisuuという名前をつけている*/

これはあまりよくない例です。しかし、seisuuというのはこの時点でintというのと同義になります
構造体の中身も型なので、=としてもさほど問題は起きないと思います。

Re:構造体

Posted: 2007年9月13日(木) 09:15
by toyo
typedefは構造体以外でも結構使われています
typedef 型 別名;
の様に書きます
Windowsでも
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
など型定義がされています。
型の部分には構造体も使えるので
typedef struct タグ名{ } 別名;
と書けます。
typedefの場合は構造体タグ名を省略できるのでご質問の部分の書き方になっています。
使用目的はやはりタイプ量を減らせるというのが大きいですね

Re:構造体

Posted: 2007年9月13日(木) 11:11
by たかぎ
構造体の場合は typedef を使っても害は少ないのですが、整数型の typedef はあまり乱用しない方がいいですよ。
というのも、typedef 名にしてしまうと本来の型が一見しただけではわからなくなるので、整数拡張や通常の算術型変換の振る舞いが把握しづらくなるからです。

C++ の場合はもっと顕著で、多重定義やテンプレートがどう解決されるのか、ソースを少し見ただけでは分からなくなってしまいます。実際の型に依存しないように、正しくコーディングされているならよいのですが、そんなことは稀ですから。

Re:構造体

Posted: 2007年9月13日(木) 18:56
by tk-xleader
>C++ の場合はもっと顕著で、多重定義やテンプレートがどう解決されるのか、ソースを少し見ただけでは分からなくなってしまいます。実際の型に依存しないように、正しくコーディングされているならよいのですが、そんなことは稀ですから。

もしかしてtemplate機能においてtypedefした型をtypedefごとに生成するコンパイラはありませんよね?

Re:構造体

Posted: 2007年9月13日(木) 22:05
by Shera
皆さん、詳しい回答をありがとうございます

またなにかわからないことがあればお聞きすると思いますので
そのときはよろしくお願いします

Re:構造体

Posted: 2007年9月13日(木) 23:05
by たかぎ
> もしかしてtemplate機能においてtypedefした型をtypedefごとに生成するコンパイラはありませんよね?

ありません。

Re:構造体

Posted: 2007年9月13日(木) 23:21
by tk-xleader
それはさすがに無茶でした。