- ベストアンサー
構造体の通用範囲の広げ方
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>構造体は同名の宣言をすると過去の同名の定義済みのものは、内容も全て消えエラーも出ないみたいなのですが、 基本的に変数のスコープと同じです。なので「構造体は同名の宣言をすると過去の同名の定義済みのものは、内容も全て消えエラーも出ない」のは、グローバル変数とローカル変数の関係と同じです。グローバル同士で同じ構造体名ならエラーになります。 >構造体の通用範囲を広げたい場合(グローバル化 static化 extern化など)はどう扱えば良いのでしょうか? 構造体の定義をヘッダに書きましょう。そうすれば、ヘッダをインクルードしているソースで同じ構造体を扱えます。構造体の変数は普通の変数と同じ宣言の仕方で問題ないです。 [ヘッダ側] //宣言 struct a { char b; int c; }; //変数の宣言 extern struct a varA;//extern [ソース側] //変数の宣言 struct a varA;//グローバル static struct a varB;//static
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
#2 も書かれてるけど, どんなコードで話をしてるのか見当がつかないので具体例を出してください.
お礼
すみません解決できましたので; ご回答ありがとうございました。
- asuncion
- ベストアンサー率33% (2126/6288)
そもそも、「構造体だから」特別に扱う、という必要がありません。 int型やchar型など、C言語がもともと持っている型と扱いは同じです。
お礼
先日構造体が関数を持つ という例を見て依頼、 使い方が少し変わっていた所為もあってか、何か特別なのだろうと 勝手に勘違いをしてしまっていた様です。 ありがとうございました。
- redfox63
- ベストアンサー率71% (1325/1856)
> 構造体は同名の宣言をすると > 過去の同名の定義済みのものは、内容も全て消えエラーも出ない この辺りをコードにしてお示しになったほうが回答が着きやすいかも 構造体の定義は共通ヘッダーに追いやる アプリ全体で扱いたいなら構造体変数を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 ); } といった具合です
お礼
ご回答ありがとうございました。 >構造体の定義は共通ヘッダーに追いやる >アプリ全体で扱いたいなら構造体変数をexternで共通ヘッダに宣言 >実体を何処かのソースに作る 実体は後々作っても大丈夫だったのですね。 ちょっと色々と自分なりに情報を探し回ってる間に、 かなり勘違いを溜め込んでしまっていた様です。 サンプルコードと共々、 ありがとうございました。
関連するQ&A
- 構造体のextern方法
C++のビギナーなのですが、 普通の変数、配列のexternはできているのですが、 構造体をexternができずに困っています。 2時間ほど調べまわったのですが、 typedefを使わなければならない(?) とか 構造体は変数なんかと違い、特別なやり方をしないとダメらしい事までは解ったのですが、 実際動くやり方を見つけきれませんでした; 方法(手順)や、解説サイトなどをご存知でしたら、教えて頂けると幸いです。
- ベストアンサー
- C・C++・C#
- 構造体と構造体型の変数宣言箇所
はじめてborlandC++builder6でプログラムを作っているのですが、構造体と構造体型の変数宣言箇所についてわからないことがあるので質問させてください。 あるフォームのソースファイル(○○○.cpp)内の関数で、自分で定義した構造体を使う場合、ヘッダファイル(○○○.h)に構造体を定義すると、関数内で「変数が未定義」エラーになってしまいます。一方、ソースファイル(○○○.cpp)の先頭に書けばエラーになりません。 ヘッダファイルに変数定義した場合とソース内の先頭に構造体と構造体型変数を定義するのでは何が違ってくるのでしょうか?
- ベストアンサー
- C・C++・C#
- sqliteの構造体
SQLiteを使ったメールソフトを作っています。 sqliteの構造体 sqlite3_stmt の宣言は見つかるのですが 構造体の内容の定義してあるものが見つかりません。 sqlite3.h, sqlite3.c を探したのですが見つかりませんでした。 この構造体が見つからないと そこに登録してある値が使えません。 それとも、 この構造体は定義されていなくて これを当てにしないで プログラムを組まなくてはいけないのでしょうか? 使わなくても動かせそうですか。。。 お分かりの方、よろしくお願いします。
- ベストアンサー
- C・C++・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"; } } } 配列の初期化等は、ようやく理解したつもりではいますが、構造体 が絡むとどうしてもわかりません。 どこをどのように修正したら良いかを教えて下さい。 初歩的な質問で申し訳ありませんが、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- VB2008: 構造体と関数との関係?
VB.Net を知って60日余という初学者です。 やっと、構造体の基本事項の確認まで辿り着きました。 で、構造体と関数の関係をテスト。 結果、「関数に構造体全体を渡す場合には、たとえモジュールレベルの変数として宣言してモジュールレベルだけで用いるとしても Public で広域な変数として宣言しなければならない」ことが判明しました。 このことに関しての個人的な見解は次のようです。 >「関数のパラメータの型に用いる構造体等は全て Public で宣言されることで公開されていなければならない。 >関数がどういう型を受け取って、どのように演算し、いかなる型の値として戻すかは公開されていてこそ判断できる。 つまり、「関数の内々の事情、関数の約束事からの Public 宣言であって、構造体の通用範囲を広域にするためのそれではない」というのが私の理解。 問題は、MSDN ライブラリでこの理解の裏付けを取りたいのですが、なかなか見つかりません。 そこで、質問の角度を変えます。 この「関数の内々の事情説」、「関数の約束事説」という理解はいかがなものでしょうか?
- ベストアンサー
- Visual Basic
- 構造体メンバへの代入
とても初歩的なことなのですが、 typedef struct _X{ int x; }X[50]; と構造体を定義して X[0].x = 0; と0を代入しようとすると、「宣言が正しく終了していない」とエラーが出てしまいます。 これはなぜでしょうか? ちなみにMicrosoft Visual C++ 2005 Express Editionを使っています。
- ベストアンサー
- C・C++・C#
- 構造体の静的な初期化
構造体の静的な初期化で、初期化が書かれていないメンバーは、 どうなるのでしょうか。。? たとえば・・・ // 構造体の宣言 strcut MY_STRUCT { int data1 ; int data2 ; int data3 ; int data4 ; } ; // 変数宣言&初期化 static strcut MY_STRUCT st = { .data1 = 100, .data3 = 300 } ; ネットで調べると、 初期化で指示されていないメンバーは0に初期化される、 という記述も一つだけ見つけたのですが・・・これはC言語(C99)の仕様でしょうか? それともコンパイラ依存の仕様でしょうか?
- ベストアンサー
- C・C++・C#
お礼
ありがとうございます。 >基本的に変数のスコープと同じです。 そうだったのですか。 自分の理解が足りないせいで勘違いしていたのですね。 サンプルを参考にやらせて頂いたら上手く動作してくれました。 頭の中でぐるぐる回ってた疑問がこれで1つ溶けた気がします。 ありがとうございましたっ