dポイントプレゼントキャンペーン実施中!

(以前似た質問させて頂いたのですが、勘違いしていたのでもう一度。)

構造体は同名の宣言をすると
過去の同名の定義済みのものは、内容も全て消えエラーも出ないみたいなのですが、
構造体の通用範囲を広げたい場合(グローバル化 static化 extern化など)は
どう扱えば良いのでしょうか?

なかなかそういう通用範囲に関する解説を見つけられず困っています。
詳しい解説サイト等でも構いませんので、何か教えて下さると助かります。 orz

A 回答 (4件)

>構造体は同名の宣言をすると過去の同名の定義済みのものは、内容も全て消えエラーも出ないみたいなのですが、



基本的に変数のスコープと同じです。なので「構造体は同名の宣言をすると過去の同名の定義済みのものは、内容も全て消えエラーも出ない」のは、グローバル変数とローカル変数の関係と同じです。グローバル同士で同じ構造体名ならエラーになります。

>構造体の通用範囲を広げたい場合(グローバル化 static化 extern化など)はどう扱えば良いのでしょうか?

構造体の定義をヘッダに書きましょう。そうすれば、ヘッダをインクルードしているソースで同じ構造体を扱えます。構造体の変数は普通の変数と同じ宣言の仕方で問題ないです。

[ヘッダ側]
//宣言
struct a {
char b;
int c;
};
//変数の宣言
extern struct a varA;//extern

[ソース側]
//変数の宣言
struct a varA;//グローバル
static struct a varB;//static
    • good
    • 0
この回答へのお礼

ありがとうございます。
>基本的に変数のスコープと同じです。
そうだったのですか。
自分の理解が足りないせいで勘違いしていたのですね。

サンプルを参考にやらせて頂いたら上手く動作してくれました。
頭の中でぐるぐる回ってた疑問がこれで1つ溶けた気がします。
ありがとうございましたっ

お礼日時:2009/04/01 14:42

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2009/04/01 14:50

そもそも、「構造体だから」特別に扱う、という必要がありません。


int型やchar型など、C言語がもともと持っている型と扱いは同じです。
    • good
    • 0
この回答へのお礼

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

ありがとうございました。

お礼日時:2009/04/01 14:48

> 構造体は同名の宣言をすると


> 過去の同名の定義済みのものは、内容も全て消えエラーも出ない

この辺りをコードにしてお示しになったほうが回答が着きやすいかも

構造体の定義は共通ヘッダーに追いやる
アプリ全体で扱いたいなら構造体変数を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 );
}
といった具合です
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

>構造体の定義は共通ヘッダーに追いやる
>アプリ全体で扱いたいなら構造体変数をexternで共通ヘッダに宣言
>実体を何処かのソースに作る

実体は後々作っても大丈夫だったのですね。
ちょっと色々と自分なりに情報を探し回ってる間に、
かなり勘違いを溜め込んでしまっていた様です。

サンプルコードと共々、
ありがとうございました。

お礼日時:2009/04/01 14:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!