関数を使えるようにするには?

解決


matumoto  2007-06-04 13:30:21  No: 65296  IP: 192.*.*.*

Aファイルに  void FILE_NAME_READ(void) という関数の本体があって、
Bファイルで  FILE_NAME_READ();  と呼び出して使いたいんですけど、
Bファイルで、その関数はないというエラーコードがでてコンパイルが通りません。 

原因を教えてください。お願いします。

編集 削除
YuO  2007-06-04 14:53:03  No: 65297  IP: 192.*.*.*

使用する箇所より前でプロトタイプの宣言をしていますか?

編集 削除
夏みかん  2007-06-04 17:02:43  No: 65298  IP: 192.*.*.*

Bファイルの先頭に次の1行を記述します。

extern void FILE_NAME_READ(void);
 :
処理
 :

あとヘッダファイルを作成してそこにプロトタイプを宣言して
Bファイルの先頭に

#include "xxxx.h"

と記述する方法が一般でしょうな。
今後の参考に。

編集 削除
matumoto  2007-06-04 18:26:54  No: 65299  IP: 192.*.*.*

YuO様夏みかん様ありがとうございます!

結局夏みかん様の下のやり方でやることにしました。
で、ここでまた問題が発生したのですが、今共通して使うグローバル変数を
Bファイルの先頭で宣言しているんですけど、コンパイルすると、
Aファイルの方で、
「's' : 定義されていない識別子です。」
というエラーがでて先に進めません。

力を貸してください。宜しくお願いします。

編集 削除
YuO  2007-06-04 19:01:28  No: 65300  IP: 192.*.*.*

根っこは一緒ですね。
Aファイルの方で宣言されていないのでしょう。
変数にしろ関数にしろ使う前に宣言してやる必要があります。
# 定義は宣言の一種なので (Cの場合),定義している場合は他に宣言は不要。

ヘッダファイル中に,
extern int s;
の一行 (int型の場合) を追加してやると良いかと。
# Aファイルの方でもヘッダファイルをインクルードしてやる必要あり。

編集 削除
matumoto  2007-06-04 19:15:32  No: 65301  IP: 192.*.*.*

YuO様

ありがとうございます!万事解決しました!
もしよろしければもう一つ質問したいんですけど、
上記の場合、グローバル変数は一度Cファイルに宣言しないとだめですか?
Hファイルとかで一括宣言っていう方法はないですかね?

編集 削除
mあ  2007-06-04 20:50:35  No: 65302  IP: 192.*.*.*

#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言語との互換性を
持たせたいとか、色々突っ込むと記述が複雑怪奇になり見た目
なんだかよくわからない何かを定義・宣言しているブラックボッ
クスみたいなファイルになってしまうので外部参照・宣言くらい
に留めておいた方が良いです。

編集 削除
YuO  2007-06-04 22:42:12  No: 65303  IP: 192.*.*.*

> 上記の場合、グローバル変数は一度Cファイルに宣言しないとだめですか?
> Hファイルとかで一括宣言っていう方法はないですかね?

#includeとは,その位置にファイルを取り込む機能です。
つまり,取り込まれるファイルをその位置に記述することと,ほぼ同等の意味を持ちます。
# ほぼと書いたのは,__FILE__とか__LINE__とかがあるから。

そのため,.hに宣言を書いてそれを取り込むのであれば,.cファイルで宣言する必要はありません。
ただし,変数にしろ関数にしろ使うには「定義」が一箇所に無いといけませんから,それは別途行う必要があります。


根本的なところとして,グローバル変数は,本当に必要な場合を除いて使わないのが普通です。
まずは必要かどうかを考え直してみるのも良いかと。
# 関数の引数にできないか,内部結合 (static) にできないか,など。

Cマガジン2000年4月号「プログラミングの禁じ手 C言語編」
http://www.cmagazine.jp/src/kinjite/c/variable.html#index10
とかも参考になるかと思います。

編集 削除
matumoto  2007-06-06 15:12:05  No: 65304  IP: 192.*.*.*

解決しました!ありがとうおざいまうぃた!!

編集 削除