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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
いちこ
記事: 62
登録日時: 11年前
連絡を取る:

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

#1

投稿記事 by いちこ » 10年前

おはようございます。
プログラム初心者です。よろしくおねがいします。

現在、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
です。

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

Rittai_3D
記事: 525
登録日時: 11年前

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

#2

投稿記事 by Rittai_3D » 10年前

インクルードするのはヘッダファイルでないのですか?

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

コード:

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

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

因みに、C++は

#pragma once

の一行で防げます。
初心者です

いちこ
記事: 62
登録日時: 11年前
連絡を取る:

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

#3

投稿記事 by いちこ » 10年前

>>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'が未解決」
というエラーが表示されてしまいました。
どこか、間違っているところを指摘していただけると幸いです。
よろしくおねがいします。

Rittai_3D
記事: 525
登録日時: 11年前

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

#4

投稿記事 by Rittai_3D » 10年前

そうですね。自分なら全部に書いてしまいますけどね。あとあと面倒になりそうなのでw

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

あと、開発環境を教えてください。
初心者です

いちこ
記事: 62
登録日時: 11年前
連絡を取る:

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

#5

投稿記事 by いちこ » 10年前

>>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
です。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

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

#6

投稿記事 by へにっくす » 10年前

bcc main.c sub1.c sub2.c a.c b.c c.c
というようにまとめて渡していますか?

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

Rittai_3D
記事: 525
登録日時: 11年前

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

#7

投稿記事 by Rittai_3D » 10年前

自分でも調べてみましたか?

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

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

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

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

いちこ
記事: 62
登録日時: 11年前
連絡を取る:

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

#8

投稿記事 by いちこ » 10年前

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る