C言語関係掲示板

過去ログ

No.1132 プログラムをファイルごとにまとめる方法

[戻る] [ホームページ]
No.2207

プログラムをファイルごとにまとめる方法
投稿者---初心者(2004/07/02 14:19:22)


コンパイラはGcc Developer Liteです。
mainとなるプログラムで
#include "func1.c"
#include "func2.c"
#include "func3.c"
....
としたとき
func3に関連する外部変数を
int F3;
とfunc3の文頭で宣言しておいたとき
func1,func2の中の関数でF3を使おうとすると
"undeclared"とコンパイルエラーになってしまいます。
同様に
func1のなかでfunc2,func3内の関数をコールすると
コンパイルエラーになってしまいます。
コンパイラは前だけみてコンパイルしているのだと
思いますが
includeする順序に関係なく各ファイル間の
外部変数を参照したり関数をコールできるように
するにはどのようにすればよいか
教えてください。


No.2208

Re:プログラムをファイルごとにまとめる方法
投稿者---ニタチ(2004/07/02 14:35:33)


こちらを参考にしてみてください。

http://homepage1.nifty.com/aok2/004/c01.html



No.2210

Re:プログラムをファイルごとにまとめる方法
投稿者---初心者(2004/07/02 18:14:35)


>こちらを参考にしてみてください。

ありがとうございました。
変数の場合はわかりました。

質問が正確ではなかったのですが
使おうとしたのは変数ではなくて(?)下記のように
設定されたマイコンのビットのADR_OFFでした。

この場合は
extern xxxx
何とかけばよいのでしょうか?
色々トライしてみましたが、うまくいきません。
教えてください。

struct  ADR_PIN   {
        unsigned char   B7:1;
        unsigned char   B6:1;
        unsigned char   B5:1;
        unsigned char   B4_0:5;
        } ;

#define PA_DR (*(struct ADR_PIN *)0xfffd3)
#define ADR_OFF  PA_DR.B5




No.2209

Re:プログラムをファイルごとにまとめる方法
投稿者---REE(2004/07/02 14:41:42)


以下の方法がお勧めです。

1.func1.c の 外部変数、外部関数の宣言をfunc1.h ファイルに書く
2.func2,3についても同様に
3.mainとなるプログラムでの#include "func1.c"などを削除する。
4.各*.cのファイルの先頭に必要となる関数の宣言がある*.hのファイルを#includeする。
5.コンパイルする時に、4つの*.cファイルを全て指定する。



No.2211

Re:プログラムをファイルごとにまとめる方法
投稿者---初心者(2004/07/02 18:26:13)


回答ありがとうございました。

ただ、コンパイラには
>5.コンパイルする時に、4つの*.cファイルを全て指定する。
の選択機能はないようです。

無償のLite版のためか?
私の調査不足なのか?
もう一度調べてみますが、もしなければ
教えていただいた方式は無理ということでしょうか?




No.2213

Re:プログラムをファイルごとにまとめる方法
投稿者---REE(2004/07/02 19:22:16)


>>5.コンパイルする時に、4つの*.cファイルを全て指定する。
>の選択機能はないようです。

>もう一度調べてみますが、もしなければ
>教えていただいた方式は無理ということでしょうか?

出来ないのであれば、やめた方がいいです。

一つだけヘッダーファイルを作成して、以下の様にしたあと、
元のソースファイルの#include "func1.c"より前でincludeして下さい。

#defineは、すべてヘッダーファイルに移動
構造体・型宣言もすべてヘッダーファイルに移動
変数は、定義または宣言をヘッダーファイルに移動
関数は、プロトタイプ宣言をヘッダーファイルに書く



No.2215

Re:プログラムをファイルごとにまとめる方法
投稿者---初心者(2004/07/02 21:08:25)


>一つだけヘッダーファイルを作成して、以下の様にしたあと、
>元のソースファイルの#include "func1.c"より前でincludeして下さい。
>
>#defineは、すべてヘッダーファイルに移動
>構造体・型宣言もすべてヘッダーファイルに移動
>変数は、定義または宣言をヘッダーファイルに移動
>関数は、プロトタイプ宣言をヘッダーファイルに書く

回答ありがとうございます。

教えていただいたことに私の勝手な解釈(?)で
下記のように考えてよろしいでしょうか?

func1.hにfunc1.cに関係する(回答いただいた)全てを書く。
>一つだけヘッダーファイルを作成して
func1,func2,func3の全てを1つにまとめてしまうと
後でわかりにくくなるとして。
同様に
func2.h,func3.hを作る。
メインとなるプログラムで順序に関係なく

#include "func1.h"
#include "func2.h"
#include "func3.h"
...
このあとも順序に関係なく
#include "func1.c"
#include "func2.c"
#include "func3.c"
...
でよいでしょうか?

よろしく御願いします。



No.2224

Re:プログラムをファイルごとにまとめる方法
投稿者---REE(2004/07/05 10:12:25)


>メインとなるプログラムで順序に関係なく
>
>#include "func1.h"
>#include "func2.h"
>#include "func3.h"
>...

この3つの間に依存関係が無ければ大丈夫です。

>このあとも順序に関係なく
>#include "func1.c"
>#include "func2.c"
>#include "func3.c"
>...
>でよいでしょうか?

こちらは、大丈夫です。(そのためにヘッダファイルを作ったのですから)




No.2216

Re:プログラムをファイルごとにまとめる方法
投稿者---YuO(2004/07/03 00:47:12)


>ただ、コンパイラには
>>5.コンパイルする時に、4つの*.cファイルを全て指定する。
>の選択機能はないようです。

本当にないのですか?

コマンドラインから4つのファイルを全て指定したり,
コンパイルのみのオプションをつけてそれぞれをコンパイルしてリンカを使ってリンクすれば,
普通はできるはずですが。


>無償のLite版のためか?

Gcc Developer Liteというのはそもそもコンパイラではないようですし。
#コンパイラはGNUのgcc。


No.2219

Re:プログラムをファイルごとにまとめる方法
投稿者---初心者(2004/07/03 13:48:32)


>Gcc Developer Lite</a>というのはそもそもコンパイラではないようですし。
>#コンパイラはGNUのgcc。

ありがとうございます。

実はそんな事もしらない初心者でした。


No.2225

Re:プログラムをファイルごとにまとめる方法
投稿者---ニタチ(2004/07/05 12:07:00)


>ただ、コンパイラには
>>5.コンパイルする時に、4つの*.cファイルを全て指定する。
>の選択機能はないようです。

 私の環境(WindowsXP、Borland C++Builder 6)なら、このようにすればできます。
 C:\test>bcc32 main.c func1.c func2.c func3.c