No.1ベストアンサー
- 回答日時:
>構造体は同名の宣言をすると過去の同名の定義済みのものは、内容も全て消えエラーも出ないみたいなのですが、
基本的に変数のスコープと同じです。なので「構造体は同名の宣言をすると過去の同名の定義済みのものは、内容も全て消えエラーも出ない」のは、グローバル変数とローカル変数の関係と同じです。グローバル同士で同じ構造体名ならエラーになります。
>構造体の通用範囲を広げたい場合(グローバル化 static化 extern化など)はどう扱えば良いのでしょうか?
構造体の定義をヘッダに書きましょう。そうすれば、ヘッダをインクルードしているソースで同じ構造体を扱えます。構造体の変数は普通の変数と同じ宣言の仕方で問題ないです。
[ヘッダ側]
//宣言
struct a {
char b;
int c;
};
//変数の宣言
extern struct a varA;//extern
[ソース側]
//変数の宣言
struct a varA;//グローバル
static struct a varB;//static
ありがとうございます。
>基本的に変数のスコープと同じです。
そうだったのですか。
自分の理解が足りないせいで勘違いしていたのですね。
サンプルを参考にやらせて頂いたら上手く動作してくれました。
頭の中でぐるぐる回ってた疑問がこれで1つ溶けた気がします。
ありがとうございましたっ
No.4
- 回答日時:
#2 も書かれてるけど, どんなコードで話をしてるのか見当がつかないので具体例を出してください.
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 );
}
といった具合です
ご回答ありがとうございました。
>構造体の定義は共通ヘッダーに追いやる
>アプリ全体で扱いたいなら構造体変数をexternで共通ヘッダに宣言
>実体を何処かのソースに作る
実体は後々作っても大丈夫だったのですね。
ちょっと色々と自分なりに情報を探し回ってる間に、
かなり勘違いを溜め込んでしまっていた様です。
サンプルコードと共々、
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/15 08:30
- 物理学 磁性体に関する熱力学の問題が分かりません 1 2023/07/18 03:23
- 哲学 概念について 1 2023/04/09 15:09
- 英語 ソシュール言語観による品詞、単語、辞書理解の誤り 4 2022/11/24 12:27
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- 化学 化学 個体の構造の範囲で 覚えておくと便利な公式のようなものありますか? 0 2023/05/21 13:16
- 哲学 説得力を修辞の巧みさまたは論理の強さの2つに分析するにはどうすると良いでしょうか? 0 2022/07/20 05:46
- 数学 この写真の問題の(2)について何ですが、(1)の「2解が共に1より大きい」という時は写真のように、 5 2022/07/22 11:46
- 日本語 「に」について 9 2022/10/25 16:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2重定義って??
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
構造体の宣言でエラーが出ます。
-
構造体の要素すべてに対する四...
-
C++のfor文について
-
visualstudio C# テキストボッ...
-
C++で構造体のコピーはできても...
-
typedef enumの使い方を教えて...
-
関数の実体定義にヘッダファイ...
-
C++ クラスをメンバにもつクラ...
-
gccのエラー "initialization d...
-
unsigned *という宣言について
-
intとINTの違いは?
-
DDVによるメッセージの変更
-
識別子が定義されていませんと...
-
エラー「invalid conversion fr...
-
staticで初期化した変数(?)を使...
-
GCCで暗黙の型変換の警告を出し...
-
C++でboolにintの値を代入する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
構造体の要素すべてに対する四...
-
typedef enumの使い方を教えて...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
関数の実体定義にヘッダファイ...
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
C++でboolにintの値を代入する...
-
構造体の宣言でエラーが出ます。
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
C言語 宣言した変数になにも代...
-
0除算を判定したい
おすすめ情報