ヘッダに宣言した構造体にあるモジュールでテデータを格納し、
各々のモジュールでそのデータを参照したいのですが、
以下の方法で可能でしょうか?
##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"を記述
No.6ベストアンサー
- 回答日時:
> A.cにstCmn Cmn_infを宣言しなければなりませんか?
> ヘッダでexternしていればincludeしているモジュール
> で同等に扱えないのでしょうか?
別に A.c にしなければいけない、ということではないんですが、必ずどこかに
ひとつ必要になります。
extern ~ は、あくまでも「こういう変数が有るはずなので、使って良いよ」と
いう宣言でしかないんです。その「変数が有るはず」の「有る」ことをどこかに
記述しなければいけません。
試してみれば分かりますが、その「有る」を省略して、プログラムをリンクすると
エラーが出ます。メッセージの内容はコンパイラ・リンカによって違いますが
「参照が解決できませんでした」というような。
A.c も B.c も外部変数を利用する、という立場で同じレベルにしておきたければ
外部変数の定義用のソースを一本作るのがすっきりするかもしれません。
★A.c
#include "ヘッダファイル"
★外部変数定義用.c
#include "ヘッダファイル"
stCmn Cmn_inf;
No.5
- 回答日時:
理屈は、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);
# とはいうものの、外部変数を使うことはお勧めしません
A.cにstCmn Cmn_infを宣言しなければなりませんか?
ヘッダでexternしていればincludeしているモジュール
で同等に扱えないのでしょうか?
No.4
- 回答日時:
失礼、ranxさんの回答を見て見落としに気付きました。
Cmn_infは確かに変数にはなっていませんね。
Cmn_infを変数として使いたいのであれば、typedefではなく、例えば
stCmn Cmn_inf;
としてA.cのグローバル領域で定義し、B.cで
extern stCmn Cmn_inf;
として参照すべきです。
尚、当たり前ですが、それぞれのファイルの中身はインクルードファイルの記述や関数の形式での記述が必要です。
No.3
- 回答日時:
忘れ物です。
(^_^;ヘッダファイルを自作するときは以下の様な構造にする癖を付けた方が良いですよ。
#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.2
- 回答日時:
NGだと思います。
typedef stCmn Cmn_inf;
はデータの「型」を定義しただけであって、
データ(記憶領域)を定義したものではありません。
コンパイル時にエラーとなると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- JavaScript jsonテキストデータの並び替えができるサービスを教えてください 2 2022/08/05 20:16
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
右ビットシフト
-
Linux Cプログラミングを学ぶた...
-
プログラミングについて。 1つ...
-
[C言語]fputsとfprintfの違い
-
こんなことてしますか??
-
Notepad++の関数リスト表示の変...
-
gccを行ってもexeファイルが生...
-
どちのほうがすきですか?
-
Notepad++の関数リスト表示でC...
-
VisualStudio2022でC言語プログ...
-
C言語をコンパイルするとコンピ...
-
Stuck
-
VisualStudioで、コードを印刷...
-
プログラミング言語の制作方法...
-
mallocについて
-
あなたは、Excelはどうやって学...
-
Linuxでの開発環境構築や設定の...
-
chatgptでつくってもらったコー...
-
c言語
-
License='MIT' ってなんでmitな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列と関数の練習問題
-
システムエンジニアの適正について
-
[C言語]fputsとfprintfの違い
-
C言語をコンパイルするとコンピ...
-
mallocについて
-
どちのほうがすきですか?
-
ArduinoのジャイロモジュールMP...
-
大量のデータを読み込んで表示...
-
gccを行ってもexeファイルが生...
-
VisualStudio2022でC言語プログ...
-
C言語 列挙型(enum型)変数について
-
こんなことてしますか??
-
C言語の関数と配列に関する質問
-
Linuxでの開発環境構築や設定の...
-
質問失礼します。 プログラム言...
-
MACで動く実行ファイルをWindow...
-
WindowsのCapsLock(キャップス...
-
これなにがちがうんですか??
-
卒業研究でよく分からないとこ...
-
gcc13.2のバグ?
おすすめ情報