Aファイルに void FILE_NAME_READ(void) という関数の本体があって、
Bファイルで FILE_NAME_READ(); と呼び出して使いたいんですけど、
Bファイルで、その関数はないというエラーコードがでてコンパイルが通りません。
原因を教えてください。お願いします。
使用する箇所より前でプロトタイプの宣言をしていますか?
編集 削除Bファイルの先頭に次の1行を記述します。
extern void FILE_NAME_READ(void);
:
処理
:
あとヘッダファイルを作成してそこにプロトタイプを宣言して
Bファイルの先頭に
#include "xxxx.h"
と記述する方法が一般でしょうな。
今後の参考に。
YuO様夏みかん様ありがとうございます!
結局夏みかん様の下のやり方でやることにしました。
で、ここでまた問題が発生したのですが、今共通して使うグローバル変数を
Bファイルの先頭で宣言しているんですけど、コンパイルすると、
Aファイルの方で、
「's' : 定義されていない識別子です。」
というエラーがでて先に進めません。
力を貸してください。宜しくお願いします。
根っこは一緒ですね。
Aファイルの方で宣言されていないのでしょう。
変数にしろ関数にしろ使う前に宣言してやる必要があります。
# 定義は宣言の一種なので (Cの場合),定義している場合は他に宣言は不要。
ヘッダファイル中に,
extern int s;
の一行 (int型の場合) を追加してやると良いかと。
# Aファイルの方でもヘッダファイルをインクルードしてやる必要あり。
YuO様
ありがとうございます!万事解決しました!
もしよろしければもう一つ質問したいんですけど、
上記の場合、グローバル変数は一度Cファイルに宣言しないとだめですか?
Hファイルとかで一括宣言っていう方法はないですかね?
#define __MAIN_PGM__
マクロを定義したいファイルの先頭で記述します。
参照だけにしたいファイルには記述しません。
次に、
このマクロの下にインクルードファイルを並べます。
各インクルードファイルは以下のような取り決めで記述します。
#ifndef __XXXX_H__
#define __XXXX_H__
#ifdef __MAIN_PGM__
#define MY_EXTERN
#else
#define MY_EXTERN extern
#endif
MY_EXTERN char v1;
MY_EXTERN int v2;
MY_EXTERN long v3;
MY_EXTERN double v4;
#endif
上記内容が、XXXX.H に記述されているとき、
__MAIN_PGM__ を宣言しないファイル中では、
extern char v1;
extern int v2;
extern long v3;
extern double v4;
と外部参照変数として宣言されます。
__MAIN_PGM__ が定義されているファイル中では、
char v1;
int v2;
long v3;
double v4;
と未初期化の変数実体として定義されます。
同時に初期化とか、関数ポインタとか、古いC言語との互換性を
持たせたいとか、色々突っ込むと記述が複雑怪奇になり見た目
なんだかよくわからない何かを定義・宣言しているブラックボッ
クスみたいなファイルになってしまうので外部参照・宣言くらい
に留めておいた方が良いです。
> 上記の場合、グローバル変数は一度Cファイルに宣言しないとだめですか?
> Hファイルとかで一括宣言っていう方法はないですかね?
#includeとは,その位置にファイルを取り込む機能です。
つまり,取り込まれるファイルをその位置に記述することと,ほぼ同等の意味を持ちます。
# ほぼと書いたのは,__FILE__とか__LINE__とかがあるから。
そのため,.hに宣言を書いてそれを取り込むのであれば,.cファイルで宣言する必要はありません。
ただし,変数にしろ関数にしろ使うには「定義」が一箇所に無いといけませんから,それは別途行う必要があります。
根本的なところとして,グローバル変数は,本当に必要な場合を除いて使わないのが普通です。
まずは必要かどうかを考え直してみるのも良いかと。
# 関数の引数にできないか,内部結合 (static) にできないか,など。
Cマガジン2000年4月号「プログラミングの禁じ手 C言語編」
http://www.cmagazine.jp/src/kinjite/c/variable.html#index10
とかも参考になるかと思います。
解決しました!ありがとうおざいまうぃた!!
編集 削除