すいません、解決してないのに解決を押してしまいました。
重複となってしまい申し訳ありません。よろしければ前のトピックを削除しといていただくと嬉しいです。
お手数かけてすいません。
以下、「構造体の初期化が出来ません。」の最後の投稿の引用です。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
皆さまご回答ありがとうございます。
typedef宣言で定義が楽になるのは理解できるんです。
typedef宣言と構造体structは相性が良いですよね。
ですが、まだ
typedef struct a{ ~~~ }b;
b hoge;
と書く場合と、
typedef struct { ~~~ }b;
b hoge;
と書く場合の違いというか、前者を書く理由がいまひとつ分かりません。
どっちの例でも2行目は「struct」を省けるので楽になりますよね?
加えてどっちの例でも同じ構造を持った変数hogeが定義されてますよね。
両者のhogeの内容に違いはありませんよね?
わざわざ前者を使う例ってなんなのでしょうか。私には、前者はむしろややこしくしている感じがします。
この答えが、以下のコードについて
soft屋様のご返答してくださった
>それだとstruct csという形名とCSと言う形名を持つことになりますが、変数の実体は定義されません。
だと思うんですけど、
「struct cs」という型名とはどういうことでしょうか?
csもCSもstruct宣言と同義になったというわけではないんでしょうか?
cs hoge;
CS hoge;
と書いた場合、何が違うのでしょう?
しつこくて申し訳ありません。
構造体の初期化が出来ません。(誤って解決を押してしまいました)
Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)
cs は構造体タグ名
struct cs は型名
CS も型名(typedef名)
という違いがあります。
csだけでは型名ではないのです。C言語だと。
struct cs は型名
CS も型名(typedef名)
という違いがあります。
csだけでは型名ではないのです。C言語だと。
Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)
ということは、C言語に限れば、
struct cs hoge;
と宣言することと完全に同義なのが
CS hoge;
ということになるってことでしょうか?
また、タグ名をつけるメリットってなんなのでしょうか。
単純にある変数がどの構造体だったか覚えやすくするためでしょうか?
struct cs hoge;
と宣言することと完全に同義なのが
CS hoge;
ということになるってことでしょうか?
また、タグ名をつけるメリットってなんなのでしょうか。
単純にある変数がどの構造体だったか覚えやすくするためでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)
申し訳ないですが、フォーラムルールですので削除はできません。
理由は他の人の参考になりうる情報を残すことが、この掲示板の目的の一つでもあるからです。
さて、ご質問の件ですが
typedef struct cs{
int a;
}CS;
と書かれた場合で
cs hoge;
と書けるのはC++の場合だけで、C言語だとエラーになります。
あと
xxx.h
typedef struct cs *PCS;
xxx.c
struct cs {
int a;
};
と言った構造体の内部構造を公開しないが、引数や戻り値でポインタとして扱って外部公開するというテクニックもあります。
理由は他の人の参考になりうる情報を残すことが、この掲示板の目的の一つでもあるからです。
さて、ご質問の件ですが
typedef struct cs{
int a;
}CS;
と書かれた場合で
cs hoge;
と書けるのはC++の場合だけで、C言語だとエラーになります。
あと
xxx.h
typedef struct cs *PCS;
xxx.c
struct cs {
int a;
};
と言った構造体の内部構造を公開しないが、引数や戻り値でポインタとして扱って外部公開するというテクニックもあります。
そうです。きずなん さんが書きました:ということは、C言語に限れば、
struct cs hoge;
と宣言することと完全に同義なのが
CS hoge;
ということになるってことでしょうか?
上に書いたような場合です。きずなん さんが書きました: また、タグ名をつけるメリットってなんなのでしょうか。
単純にある変数がどの構造体だったか覚えやすくするためでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)
本来は1つのトピックであるべきなのに申し訳ありませんでした。
以後気をつけます。
あ~なるほどなるほど!
そうかそうか・・・今全ての質問が一気に解決しました。
タグ名だけを付けてポインタで扱うという手法もあるのですね。
便利ですね。
自己参照型も思えばタグ名が必要ですね。
今まで曖昧にしていたものがガッチリ固まりました。とてもスッキリしました。
回答していただいた皆様、ありがとうございました!
以後気をつけます。
あ~なるほどなるほど!
そうかそうか・・・今全ての質問が一気に解決しました。
タグ名だけを付けてポインタで扱うという手法もあるのですね。
便利ですね。
自己参照型も思えばタグ名が必要ですね。
今まで曖昧にしていたものがガッチリ固まりました。とてもスッキリしました。
回答していただいた皆様、ありがとうございました!
Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)
関数の引数に渡した構造体のポインターは
(*構造体変数名).構造体のメンバー名
か
構造体変数名->構造体のメンバー名
で参照できます
(*構造体変数名).構造体のメンバー名
か
構造体変数名->構造体のメンバー名
で参照できます
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)
かずまさん。
naohiro19さんの内容は言葉足らずかもしれませんが、けっして完全な間違いではないのでフォーローする形でお願いします。
荒れるもとになりますのでよろしくお願いします。
naohiro19さんの内容は言葉足らずかもしれませんが、けっして完全な間違いではないのでフォーローする形でお願いします。
荒れるもとになりますのでよろしくお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。