ページ 11

プログラムのインクルードについて

Posted: 2013年7月07日(日) 06:15
by いちこ
おはようございます。
プログラム初心者です。よろしくおねがいします。

現在、6つのC言語プログラム(main.c, sub1.c, sub2.c, a.c, b.c, c.c)を作成し、画像のような関係でインクルードして使いたいと思っています。
画像

ですが、main.cをコンパイルしたところ

'a'の宣言が複数見つかった
ひとつ前の'a'の定義位置
'a'の宣言が複数見つかった
ひとつ前の'a'の定義位置
'c'の宣言が複数見つかった
ひとつ前の'c'の定義位置

というエラーが表示されました。
a.cは3回、c.cは2回インクルードしているので、このようなエラーが表示されたのだと予想できましたが、どうしたら解決できるのか、自分なりに調べてみてもわからなかったので質問させていただきます。

OSはwindows7
コンパイラはBorland C++ Compiler 5.5
です。

どうしたらエラーを解決できるでしょうか。
どなたか詳しい方がおられましたら、ご教示お願いいたします。

Re: プログラムのインクルードについて

Posted: 2013年7月07日(日) 06:57
by Rittai_3D
インクルードするのはヘッダファイルでないのですか?

インクルードガードと言うものがあります。

コード:

#ifndef DEF_TEST_H //もし、DEF_TEST_Hが定義されてなかったら
#define DEF_TEST_H //定義して
//ここにプログラムを書く。
#endif //終わり
のようにすれば、多重インクルードは防げます。

#ifndeや#define、#endifはプリプロセッサでググると出てきます。

因みに、C++は

#pragma once

の一行で防げます。

Re: プログラムのインクルードについて

Posted: 2013年7月07日(日) 07:25
by いちこ
>>3D_3Dさん
返信ありがとうございます。

a.h , c.hは以下のように

コード:

#ifndef A_H
#define A_H
void A(int a[10][10]);
#endif
sub1.h , sub2.h , b.h は以下のように書いてみました。

コード:

void sub1(int a[10][10],int b);
このような書き方でいいでしょうか。
また、これらのヘッダファイルをインクルードするようプログラムを変更してコンパイルしたところ、
main.c以外では
「外部シンボル'_main'が未解決」
main.cでは
「外部シンボル'_sub1'が未解決」
「外部シンボル'_sub2'が未解決」
というエラーが表示されてしまいました。
どこか、間違っているところを指摘していただけると幸いです。
よろしくおねがいします。

Re: プログラムのインクルードについて

Posted: 2013年7月07日(日) 07:34
by Rittai_3D
そうですね。自分なら全部に書いてしまいますけどね。あとあと面倒になりそうなのでw

エラーは、関数の実体が無い時に出るものだと思います。main,sub1,sub2関数の実体はありますか?

あと、開発環境を教えてください。

Re: プログラムのインクルードについて

Posted: 2013年7月07日(日) 07:45
by いちこ
>>3D_3Dさん
返信ありがとうございます。

言われてみればそうですね、書き換えておきます(><)

すみませんが、関数の実体とは何のことでしょうか…
たとえばsub1.cは

コード:

#include  <stdio.h>
#include <stdlib.h>
#include "a.h"
#include "b.h"
#include "c.h"

boid sub1(int a[10][10],int b)
{
//省略
}
というようになっています。すべて同じディレクトリ内にあります。
知識不足ですみません。

開発環境は、
OS:Windows7
コンパイラ:Borland C++ Compiler 5.5
です。

Re: プログラムのインクルードについて

Posted: 2013年7月07日(日) 08:05
by へにっくす
bcc main.c sub1.c sub2.c a.c b.c c.c
というようにまとめて渡していますか?

一つずつ
bcc main.c
bcc sub1.c
というふうにやってたらダメですよ。そうするとmain.c、sub1.cそれぞれに全て関数の実体があると判断されて、投稿されたようなエラーが出ます。
(一つずつコンパイルして最後にリンクする手順がありますが、それはまた別の話)

Re: プログラムのインクルードについて

Posted: 2013年7月07日(日) 08:12
by Rittai_3D
自分でも調べてみましたか?

自分で調べてもわからなければまた質問してください。

( http://www7b.biglobe.ne.jp/~robe/cpphtm ... 02033.html この辺見ておくといいかも。)

あと、boidではなくvoidです。打ち間違いに注意しましょう。

自分も、charのことをcahrと書いてしまうことがありますw

Re: プログラムのインクルードについて

Posted: 2013年7月07日(日) 08:18
by いちこ
>>へにっくすさん
返信ありがとうございます。
別々にコンパイルしていました(><)
へにっくすさんのおっしゃる通りにしてみたら、きちんとコンパイルすることができました。
ありがとうございます。

>>3D_3Dさん
返信ありがとうございます。
もっと勉強します(><)
無事、コンパイルすることができました。
付き合っていただいてありがとうございました。
打ち間違いも気を付けるようにします(><)

お二方ともありがとうございました。
無事改善することができたので、解決とさせていただきます。
精進します。