OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

グローバル変数について

  • すぐに回答を!
  • 質問No.153261
  • 閲覧数69
  • ありがとう数3
  • 気になる数0
  • 回答数6
  • コメント数0

お礼率 12% (35/274)

ヘッダに宣言した構造体にあるモジュールでテデータを格納し、
各々のモジュールでそのデータを参照したいのですが、
以下の方法で可能でしょうか?

##CMN.h###
typedef struct {
char AAA[5];
char BBB[5];
}stCmn;

typedef stCmn Cmn_inf;


###A.c###

memcpy(Cmn_inf.AAA,"TEST",4);

###B.c###

char A[5];

memcpy(A,CMN_inf.AAA,4);

※ A.c B.cに #include "CMN.h"を記述
通報する
  • 回答数6
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.6
レベル14

ベストアンサー率 50% (1122/2211)

> A.cにstCmn Cmn_infを宣言しなければなりませんか?
> ヘッダでexternしていればincludeしているモジュール
> で同等に扱えないのでしょうか?

別に A.c にしなければいけない、ということではないんですが、必ずどこかに
ひとつ必要になります。

extern ~ は、あくまでも「こういう変数が有るはずなので、使って良いよ」と
いう宣言でしかないんです。その「変数が有るはず」の「有る」ことをどこかに
記述しなければいけません。

試してみれば分かりますが、その「有る」を省略して、プログラムをリンクすると
エラーが出ます。メッセージの内容はコンパイラ・リンカによって違いますが
「参照が解決できませんでした」というような。


A.c も B.c も外部変数を利用する、という立場で同じレベルにしておきたければ
外部変数の定義用のソースを一本作るのがすっきりするかもしれません。

★A.c

#include "ヘッダファイル"

★外部変数定義用.c

#include "ヘッダファイル"
stCmn Cmn_inf;
お礼コメント
sting

お礼率 12% (35/274)

ありがとうございます。
頑張ってやってみます。
投稿日時 - 2001-10-18 14:08:46
-PR-
-PR-

その他の回答 (全5件)

  • 回答No.1
レベル13

ベストアンサー率 37% (419/1115)

OKだと思います。 ただし、memcpyの第3引数はそれぞれ5とすべきですね。 4ではヌル文字がコピーされませんから。 (strcpyのが良いかもしれません)
OKだと思います。
ただし、memcpyの第3引数はそれぞれ5とすべきですね。
4ではヌル文字がコピーされませんから。
(strcpyのが良いかもしれません)
  • 回答No.2
レベル13

ベストアンサー率 24% (357/1463)

NGだと思います。 typedef stCmn Cmn_inf; はデータの「型」を定義しただけであって、 データ(記憶領域)を定義したものではありません。 コンパイル時にエラーとなると思います。
NGだと思います。
typedef stCmn Cmn_inf;
はデータの「型」を定義しただけであって、
データ(記憶領域)を定義したものではありません。
コンパイル時にエラーとなると思います。
  • 回答No.3
レベル13

ベストアンサー率 37% (419/1115)

忘れ物です。(^_^; ヘッダファイルを自作するときは以下の様な構造にする癖を付けた方が良いですよ。 #ifndef _CMN_H #define _CMN_H typedef struct { char AAA[5]; char BBB[5]; }stCmn; typedef stCmn Cmn_inf; #endif こうすると分割コンパイル時でも、_C ...続きを読む
忘れ物です。(^_^;
ヘッダファイルを自作するときは以下の様な構造にする癖を付けた方が良いですよ。

#ifndef _CMN_H
#define _CMN_H

typedef struct {
char AAA[5];
char BBB[5];
}stCmn;

typedef stCmn Cmn_inf;

#endif

こうすると分割コンパイル時でも、_CMN_Hが定義されていない初回のみヘッダファイルの中身が展開されるので多重定義等を防ぐことが出来ます。(二度目以降は#defineで_CMN_Hが定義済みなので#ifndef~#endifは展開しません)
一度stdio.hの中身等を覗くと勉強になりますよ。(^_^)
  • 回答No.4
レベル13

ベストアンサー率 37% (419/1115)

失礼、ranxさんの回答を見て見落としに気付きました。 Cmn_infは確かに変数にはなっていませんね。 Cmn_infを変数として使いたいのであれば、typedefではなく、例えば stCmn Cmn_inf; としてA.cのグローバル領域で定義し、B.cで extern stCmn Cmn_inf; として参照すべきです。 尚、当たり前ですが、それぞれのファイルの中 ...続きを読む
失礼、ranxさんの回答を見て見落としに気付きました。
Cmn_infは確かに変数にはなっていませんね。
Cmn_infを変数として使いたいのであれば、typedefではなく、例えば

stCmn Cmn_inf;

としてA.cのグローバル領域で定義し、B.cで

extern stCmn Cmn_inf;

として参照すべきです。

尚、当たり前ですが、それぞれのファイルの中身はインクルードファイルの記述や関数の形式での記述が必要です。
  • 回答No.5
レベル14

ベストアンサー率 50% (1122/2211)

理屈は、No.4 の回答の通りです。が、参照するところでいちいち外部変数の参照の 宣言をするのでは、何のためのインクルードファイルか分かりません。 なので、普通は、こう書きます。 ★ヘッダファイル extern stCmn Cmn_inf; ★A.c(別に、A.c じゃ無くてもいいんだけど、どれかのソースひとつだけ) #include "ヘッダファイル" ...続きを読む
理屈は、No.4 の回答の通りです。が、参照するところでいちいち外部変数の参照の
宣言をするのでは、何のためのインクルードファイルか分かりません。

なので、普通は、こう書きます。

★ヘッダファイル

extern stCmn Cmn_inf;

★A.c(別に、A.c じゃ無くてもいいんだけど、どれかのソースひとつだけ)

#include "ヘッダファイル"
stCmn Cmn_inf;

memcpy(Cmn_inf.AAA, "TEST", 4);

★B.c

#include "ヘッダファイル"
memcpy(A, Cmn_inf.AAA, 4);


# とはいうものの、外部変数を使うことはお勧めしません
お礼コメント
sting

お礼率 12% (35/274)

A.cにstCmn Cmn_infを宣言しなければなりませんか?
ヘッダでexternしていればincludeしているモジュール
で同等に扱えないのでしょうか?
投稿日時 - 2001-10-18 13:17:38
このQ&Aのテーマ
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ