C言語関係掲示板

過去ログ

No.609.Typedefで構造体の型定義

[戻る] [ホームページ]
No.5842

Typedefで構造体の型定義
投稿者---はこ(2003/04/17 16:45:13)


Typedefで構造体の型定義を行う際、参考書を見ると

Typedef Struct aaa{
int x;
int y;
}AAA;

と定義するパターンと、

Typedef Struct{
int x;
int y;
}AAA;

の2パターンがあります。
違いはTypedef Structのあとのaaaという文字列なのですが、
これがある場合とない場合では違いがあるのでしょうか?

No.5843

Re:Typedefで構造体の型定義
投稿者---すず(2003/04/17 17:51:18)


こんにちわ。はじめまして。

>違いはTypedef Structのあとのaaaという文字列なのですが、
>これがある場合とない場合では違いがあるのでしょうか?

構造体の宣言は次の3種類に分けることが出来ます。

struct タグ名{};     タグ名(型)のみの宣言
struct タグ名{}変数;   タグ名(型)&変数の宣言
struct {}変数;      変数のみの宣言

簡単に違いだけを説明します。
より理解を深めるために、簡単なソースを組まれることをお勧めします。

>Typedef Struct aaa{
> int x;
> int y;
>}AAA;

この場合は、structの型宣言と変数宣言を同時に行っています。
型名:aaa型
変数名:AAA

>Typedef Struct{
> int x;
> int y;
>}AAA;

この場合は、変数のみ宣言となり、ソース中では新たに変数宣言は出来ません。
したがって、この構造体の変数は、}の直後に宣言した変数のみ有効
(今回で言えばAAA)になります。

お分かりいただけたでしょうか??


No.5845

Re:Typedefで構造体の型定義
投稿者---TDa(2003/04/17 18:04:49)


>>Typedef Struct{
>> int x;
>> int y;
>>}AAA;
>
>この場合は、変数のみ宣言となり、ソース中では新たに変数宣言は出来ません。
>したがって、この構造体の変数は、}の直後に宣言した変数のみ有効
>(今回で言えばAAA)になります。
これって
Struct{
int x;
int y;
};
という構造体をtypedefしてAAAって型名にしているというのが正しいよね?

#include <stdio.h>

typedef struct { int x, y; } Foo;

int main(void)
{
    Foo foo, bar;

    foo.x = foo.y = 0;
    bar.x = 100;
    bar.y = 300;

    printf("%d, %d, %d, %d\n", foo.x, foo.y, bar.x, bar.y);
    
    return 0;
}



No.5847

Re:Typedefで構造体の型定義
投稿者---はこ(2003/04/17 18:20:53)


TDaさん。

返信ありがとうございます。
私も通常はTDaさんが書き込んで下さったソースのようにtypedefを扱っております。

ですが、
typedef struct aaa{
  int x;
  int y;
}AAA;

というように定義することができることを今日知って、両者がどう違うのか疑問を持ちました。(aaaの存在の意味がわかりません)

おわかりになりましたらご教授ください。
よろしくお願いします。

No.5848

Re:Typedefで構造体の型定義
投稿者---TDa(2003/04/17 20:23:43)


>TDaさん。
>
>返信ありがとうございます。
>私も通常はTDaさんが書き込んで下さったソースのようにtypedefを扱っております。
>
>ですが、
>
typedef struct aaa{
  int x;
  int y;
}AAA;

>というように定義することができることを今日知って、両者がどう違うのか疑問を持ちました。(aaaの存在の意味がわかりません)
>
>おわかりになりましたらご教授ください。
まぁ
typedef unsigned char UCHAR;
と定義しておけば
unsigned char ch1;
UCHAR ch2;
どっちの書き方もOKというのと同じようなものだと思います。
同じものを取り混ぜて書くとよけいに混乱するという事はおいておくとして。

No.5846

Re:Typedefで構造体の型定義
投稿者---はこ(2003/04/17 18:13:57)


すずさん。

返信ありがとうございます。
教えていただいたとおり一度プログラミングしてみました。
まだちょっと疑問があるのですが。

>>Typedef Struct aaa{
>> int x;
>> int y;
>>}AAA;
>
>この場合は、structの型宣言と変数宣言を同時に行っています。
>型名:aaa型
>変数名:AAA

私の理解ではAAAというのが型名だと思っていたのですが違うのでしょうか?
自分で作ったソースではaaaを型名として変数を宣言するとコンパイルエラー(定義されていない識別子です)が発生してしまいます。

>>Typedef Struct{
>> int x;
>> int y;
>>}AAA;
>
>この場合は、変数のみ宣言となり、ソース中では新たに変数宣言は出来ません。
>したがって、この構造体の変数は、}の直後に宣言した変数のみ有効
>(今回で言えばAAA)になります。

この場合もAAAという文字列を変数として扱おうとするとコンパイルエラーが発生してしまいます。
(AAAを型名として新たに変数を定義すればエラーは発生しません)

大変失礼かと思いますが、AAAが型名の間違いではないでしょうか?

またやはり両者の違いがわかりません。
おわかりの方、いらっしゃいましたらご教授ください。
よろしくお願いします。


No.5850

Re:Typedefで構造体の型定義
投稿者---おっ!(2003/04/17 20:56:23)


>またやはり両者の違いがわかりません。
>おわかりの方、いらっしゃいましたらご教授ください。
>よろしくお願いします。

・タグがあれば前方参照ができる。
・タグがあれば自己参照的構造体を作ることができる。
こんなところかな?

No.5851

Re:Typedefで構造体の型定義
投稿者---通りすがりA(2003/04/17 21:01:01)


一番大きな違いは変数を定義するときに
structが必要かどうかだと思います。
機能上の意義はおそらくあまり無いです。
いきなりソースを見せられたとき、
structがあるとありがたく思うこともあるかもしれません。
少なくとも、unionかstructかが明らかになる訳ですから。

No.5862

Re:Typedefで構造体の型定義
投稿者---すず(2003/04/18 10:08:48)


おはようございます。すずです。

>大変失礼かと思いますが、AAAが型名の間違いではないでしょうか?

私の勉強不足のため混乱を招いたことお詫びいたします。

私の理解していたのは、おっ!さんのおっしゃられていた
・タグがあれば前方参照ができる。
・タグがあれば自己参照的構造体を作ることができる。
ということでした。

この自己参照的構造体については、こちらを参考にしてみるのはいかがでしょうか?


No.5856

Re:Typedefで構造体の型定義
投稿者---かずま(2003/04/17 22:58:51)


> Typedef Struct aaa{

C は、大文字と小文字を区別します。Typedef、Struct と書いてはいけません。


> の2パターンがあります。
typedef struct aaa AAA;
struct aaa { int x, y; };
というパターンもありますよ。

aaa は、タグ名です。AAA は、typedef名です。
typedef名は、そのまま型名になりすが、
タグ名は必ず直前に struct を伴って型名になります。
struct aaa a;
AAA b;
struct { int x, y; } c;
という宣言があると、
a と b と c は、オブジェクト名(変数名)です。
a と b は、同じ型ですが、
c は、a とは型が異なります。

No.5860

Re:Typedefで構造体の型定義
投稿者---はこ(2003/04/18 08:48:23)


TDaさん、おっ!さん、通りすがりAさん、かずまさん。

返信どうもありがとうございます。
自分でもいろいろ調べてみたのですが、どっちがどう違う!と明確に
書いてある文献を見つけることができませんでした。

みなさんの返信を参考にさせていただくと、別に機能的に違いがある
わけではないようなので、これまでどおりあまり気にしなくていいの
かなと思っております。

おっ!さんに教えていただいた「前方参照」と「自己参照的構造体」
という言葉についてもう少し調べてみたいと思います。

みなさん、本当にどうもありがとうございました。


No.5864

Re:Typedefで構造体の型定義(まとめ)
投稿者---はこ(2003/04/18 10:26:26)


すずさんに教えていただいたホームページを見たら、
  「自己参照的構造体を定義するときには必ずタグ名を
  付けておかないといけません」
と書いてありました!
すずさんどうもありがとうございました。

昨日と今日で、みなさんに教えていただいたこと&自分で
調べたことから、この件に関する私の理解をまとめると、

1.typedefを用いて構造体の型定義を行う際、タグ名を付けて
 も付けなくても機能的には変わらない。
2.ただし、タグ名を付けないと前方参照できない。
3.同じく、自己参照的構造体を作ることができない。

となりました。
非常にお忙しいことと思いますが、私が勘違いしていないか
みなさんからのご意見をいただけると非常にうれしいです。
(1に関してが調査不足でないかとても不安です)
よろしくお願いします。