- 締切済み
構造体について
分割ファイルで構造体を使うにはヘッダファイルに書くと思うのですがどうやって書けばいいのでしょうか? charやintはexternでできるのですが・・・ 例で教えてくださいm(__)m
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
ちなみに、構造体へのポインタの宣言であれば、単に extern struct A *a; とするだけで済みます。 ただし、構造体の中身にアクセスするのであれば、完全な構造体の定義が必要になります。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
まず、char や int は extern できているということで。 char や int はC言語が持っている型なので、 extern char hoge; とすると、コンパイラには理解できます。 しかし、構造体の場合は、どういう構造なのか、コンパイラに教えてあげないと、コンパイラが理解できないというのが、答えになります。 ですから、ヘッダファイルで、 struct hogeType{ int a; int b: char c[100]; }; などと書くことで、(この場合は)hogeType という構造体を定義したことと、その具体的な構造をコンパイラに伝えます。(もちろん、hogeType でなくても、わかりやすい名前で) これで、コンパイラが、struct hogeType という型を理解したと考えておおむねOKです。 あとは、この構造体を使うところで、このヘッダファイルを include すれば、他の char や int と同じように、 struct hogeType を使うことができます。 struct hogeType hoge; // 実体の定義 extern struct hogeType hoge; // 外部定義の参照 struct hogeType func(struct hogeType a); // 構造体を引数にして、構造体を返す関数 などなど。 あと、struct hogeType というのを、簡略化して、struct なしですませようとする場合には、typedef を使います。 C++では、(typedef しなくても)struct 無しでもOKです。
申し訳ない。C言語でしたね。 先の例は、下記の *何れか* に変更してもらわないと、コンパイルできないと思います。 -- 変更パターン(1): a.c, b.c の X_t x; を struct X_t x; に変更 -- 変更パターン(2): x.h の struct X_t {...}; を typedef struct {...} X_t; に変更
構造体も extern 出来ますよ(正確には、構造体の実体も char や int (の実体)と同様に extern 出来ます)。 ## 構造体を定義することと、extern を記述することは事は次元の異なることです。 例ですが、 == x.h struct X_t { int a; char b; }; == a.c #include "x.h" void foo() { X_t x; : (処理) } == b.c #include "x.h" void bar() { X_t x; : (処理) } -- って感じでしょうか??
お礼
回答ありがとうございます。 ポインタの宣言ではないのです>< 今、main.c、sansho.c、touroku.c、sansho.h、touroku.hというのがあるんです。 で、main.cにはsansho.h、touroku.hをインクルードしていて、sansho.cにはsansho.h、touroku.cにはtouroku.hをインクルードしています。 で、main.cにはsansho.cなども分割ファイルでリンク?みたいになっているので構造体の宣言が重複してるみたいなエラーが出ちゃうんです><