• ベストアンサー

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

(以前似た質問させて頂いたのですが、勘違いしていたのでもう一度。) 構造体は同名の宣言をすると 過去の同名の定義済みのものは、内容も全て消えエラーも出ないみたいなのですが、 構造体の通用範囲を広げたい場合(グローバル化 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% (2126/6288)
回答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

  • 構造体の宣言

    下記のように構造体の宣言をした所、 struct B_PARAM test; 「`test' の領域サイズがわかりません」というエラーになってしまいました。この構造体を宣言し、値を入れていこうとしています。 ヘッダファイルに構造体の形は定義してあるのですが、 構造体の中に構造体があるからでしょうか? またこの構造体を正しく宣言するにはどうすればいいのでしょうか?

  • 構造体のextern方法

    C++のビギナーなのですが、 普通の変数、配列のexternはできているのですが、 構造体をexternができずに困っています。 2時間ほど調べまわったのですが、 typedefを使わなければならない(?) とか 構造体は変数なんかと違い、特別なやり方をしないとダメらしい事までは解ったのですが、 実際動くやり方を見つけきれませんでした; 方法(手順)や、解説サイトなどをご存知でしたら、教えて頂けると幸いです。

  • 構造体と構造体型の変数宣言箇所

    はじめてborlandC++builder6でプログラムを作っているのですが、構造体と構造体型の変数宣言箇所についてわからないことがあるので質問させてください。 あるフォームのソースファイル(○○○.cpp)内の関数で、自分で定義した構造体を使う場合、ヘッダファイル(○○○.h)に構造体を定義すると、関数内で「変数が未定義」エラーになってしまいます。一方、ソースファイル(○○○.cpp)の先頭に書けばエラーになりません。  ヘッダファイルに変数定義した場合とソース内の先頭に構造体と構造体型変数を定義するのでは何が違ってくるのでしょうか?

  • sqliteの構造体

    SQLiteを使ったメールソフトを作っています。 sqliteの構造体 sqlite3_stmt の宣言は見つかるのですが 構造体の内容の定義してあるものが見つかりません。 sqlite3.h, sqlite3.c を探したのですが見つかりませんでした。  この構造体が見つからないと そこに登録してある値が使えません。 それとも、 この構造体は定義されていなくて これを当てにしないで プログラムを組まなくてはいけないのでしょうか? 使わなくても動かせそうですか。。。 お分かりの方、よろしくお願いします。

  • C#の構造体に関して

    C#の構造体に関して C#で構造体で配列を持ちたいと思い、宣言の仕方や使い方を 勉強していますが、どうしてもコンパイルは通るもののエラーと なってしまいます。 《ソース》 単純に構造体で宣言した"a"という配列に、"ABC"という文字列を 代入したいだけですが。。。 namespace テスト環境 { struct test { public string []a; } class Program { static void Main(string[] args) { test aaa = new test(); aaa.a[0] = "ABC"; } } } 配列の初期化等は、ようやく理解したつもりではいますが、構造体 が絡むとどうしてもわかりません。 どこをどのように修正したら良いかを教えて下さい。 初歩的な質問で申し訳ありませんが、よろしくお願いします。

  • 構造体について

    linuxのソースコードを呼んでいる者ですが、構造体について、実際に使う方法が分かりません。 ソースコードを少し書き換えて改良したいのですが、構造体が定義されているので、それをそのまま引用しないといけないので分からなくなってしまいました。 例えば、それぞれの関数のなかで最初の変数宣言の部分にstructが付いているものもあれば、付いていないものもあります。 この差はなんなのでしょうか?

  • VB2008: 構造体と関数との関係?

    VB.Net を知って60日余という初学者です。 やっと、構造体の基本事項の確認まで辿り着きました。 で、構造体と関数の関係をテスト。 結果、「関数に構造体全体を渡す場合には、たとえモジュールレベルの変数として宣言してモジュールレベルだけで用いるとしても Public で広域な変数として宣言しなければならない」ことが判明しました。 このことに関しての個人的な見解は次のようです。 >「関数のパラメータの型に用いる構造体等は全て Public で宣言されることで公開されていなければならない。 >関数がどういう型を受け取って、どのように演算し、いかなる型の値として戻すかは公開されていてこそ判断できる。 つまり、「関数の内々の事情、関数の約束事からの Public 宣言であって、構造体の通用範囲を広域にするためのそれではない」というのが私の理解。 問題は、MSDN ライブラリでこの理解の裏付けを取りたいのですが、なかなか見つかりません。 そこで、質問の角度を変えます。 この「関数の内々の事情説」、「関数の約束事説」という理解はいかがなものでしょうか?

  • 構造体の使い方

    構造体が定義されている場所では、 struct runqueue{ task_t としかないのに、実際の関数の部分では task_t *p = current というように、変数として宣言されている部分があるのですが、これにはどういった意味があるのでしょうか?

  • 構造体メンバへの代入

    とても初歩的なことなのですが、 typedef struct _X{ int x; }X[50]; と構造体を定義して X[0].x = 0; と0を代入しようとすると、「宣言が正しく終了していない」とエラーが出てしまいます。 これはなぜでしょうか? ちなみにMicrosoft Visual C++ 2005 Express Editionを使っています。

  • 構造体の静的な初期化

    構造体の静的な初期化で、初期化が書かれていないメンバーは、 どうなるのでしょうか。。? たとえば・・・ // 構造体の宣言 strcut MY_STRUCT {    int data1 ;    int data2 ;    int data3 ;    int data4 ; } ; // 変数宣言&初期化 static strcut MY_STRUCT st = {    .data1 = 100,    .data3 = 300 } ; ネットで調べると、 初期化で指示されていないメンバーは0に初期化される、 という記述も一つだけ見つけたのですが・・・これはC言語(C99)の仕様でしょうか? それともコンパイラ依存の仕様でしょうか?

専門家に質問してみよう