• ベストアンサー

構造体の通用範囲の広げ方

(以前似た質問させて頂いたのですが、勘違いしていたのでもう一度。) 構造体は同名の宣言をすると 過去の同名の定義済みのものは、内容も全て消えエラーも出ないみたいなのですが、 構造体の通用範囲を広げたい場合(グローバル化 static化 extern化など)は どう扱えば良いのでしょうか? なかなかそういう通用範囲に関する解説を見つけられず困っています。 詳しい解説サイト等でも構いませんので、何か教えて下さると助かります。 orz

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

>構造体は同名の宣言をすると過去の同名の定義済みのものは、内容も全て消えエラーも出ないみたいなのですが、 基本的に変数のスコープと同じです。なので「構造体は同名の宣言をすると過去の同名の定義済みのものは、内容も全て消えエラーも出ない」のは、グローバル変数とローカル変数の関係と同じです。グローバル同士で同じ構造体名ならエラーになります。 >構造体の通用範囲を広げたい場合(グローバル化 static化 extern化など)はどう扱えば良いのでしょうか? 構造体の定義をヘッダに書きましょう。そうすれば、ヘッダをインクルードしているソースで同じ構造体を扱えます。構造体の変数は普通の変数と同じ宣言の仕方で問題ないです。 [ヘッダ側] //宣言 struct a { char b; int c; }; //変数の宣言 extern struct a varA;//extern [ソース側] //変数の宣言 struct a varA;//グローバル static struct a varB;//static

zaxs5968
質問者

お礼

ありがとうございます。 >基本的に変数のスコープと同じです。 そうだったのですか。 自分の理解が足りないせいで勘違いしていたのですね。 サンプルを参考にやらせて頂いたら上手く動作してくれました。 頭の中でぐるぐる回ってた疑問がこれで1つ溶けた気がします。 ありがとうございましたっ

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

#2 も書かれてるけど, どんなコードで話をしてるのか見当がつかないので具体例を出してください.

zaxs5968
質問者

お礼

すみません解決できましたので; ご回答ありがとうございました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

そもそも、「構造体だから」特別に扱う、という必要がありません。 int型やchar型など、C言語がもともと持っている型と扱いは同じです。

zaxs5968
質問者

お礼

先日構造体が関数を持つ という例を見て依頼、 使い方が少し変わっていた所為もあってか、何か特別なのだろうと 勝手に勘違いをしてしまっていた様です。 ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

> 構造体は同名の宣言をすると > 過去の同名の定義済みのものは、内容も全て消えエラーも出ない この辺りをコードにしてお示しになったほうが回答が着きやすいかも 構造体の定義は共通ヘッダーに追いやる アプリ全体で扱いたいなら構造体変数をexternで共通ヘッダに宣言 実体を何処かのソースに作る といった具合でいいのでは --- Sample.h typedef struct hoge {   int cbSize;   char szText[20]; }HOGE; extern HOGE myObj; void SampleFunc(); --- Main.cpp #include "Sample.h" HOGE myObj; void main() {   myObj.cbSize = sizeof( myObj );   strcpy( myObj.szText, "Sample" );   SampleFunc(); } --- Sample2.cpp #include "Sample.h" void SampleFunc() {   printf( "%d\n", myObj.cbSize );   printf( "%s\n", myObj.szText ); } といった具合です

zaxs5968
質問者

お礼

ご回答ありがとうございました。 >構造体の定義は共通ヘッダーに追いやる >アプリ全体で扱いたいなら構造体変数をexternで共通ヘッダに宣言 >実体を何処かのソースに作る 実体は後々作っても大丈夫だったのですね。 ちょっと色々と自分なりに情報を探し回ってる間に、 かなり勘違いを溜め込んでしまっていた様です。 サンプルコードと共々、 ありがとうございました。

関連するQ&A