アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

##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"を記述

A 回答 (6件)

> A.cにstCmn Cmn_infを宣言しなければなりませんか?


> ヘッダでexternしていればincludeしているモジュール
> で同等に扱えないのでしょうか?

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

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

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


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

★A.c

#include "ヘッダファイル"

★外部変数定義用.c

#include "ヘッダファイル"
stCmn Cmn_inf;
    • good
    • 0
この回答へのお礼

ありがとうございます。
頑張ってやってみます。

お礼日時:2001/10/18 14:08

理屈は、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);


# とはいうものの、外部変数を使うことはお勧めしません
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/10/18 13:17

失礼、ranxさんの回答を見て見落としに気付きました。


Cmn_infは確かに変数にはなっていませんね。
Cmn_infを変数として使いたいのであれば、typedefではなく、例えば

stCmn Cmn_inf;

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

extern stCmn Cmn_inf;

として参照すべきです。

尚、当たり前ですが、それぞれのファイルの中身はインクルードファイルの記述や関数の形式での記述が必要です。
    • good
    • 0

忘れ物です。

(^_^;
ヘッダファイルを自作するときは以下の様な構造にする癖を付けた方が良いですよ。

#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の中身等を覗くと勉強になりますよ。(^_^)
    • good
    • 0

NGだと思います。


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

OKだと思います。


ただし、memcpyの第3引数はそれぞれ5とすべきですね。
4ではヌル文字がコピーされませんから。
(strcpyのが良いかもしれません)
    • good
    • 0

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