ページ 11

分割コンパイルでの再定義の避け方教えてください

Posted: 2011年7月12日(火) 00:07
by ペキロゲン
今学校でC言語で課題をやっているのですが、再定義によるエラー( multiple definition )が出てしまいました。
例えば"hoge.h"というヘッダファイルで関数の宣言をして、そのヘッダファイルを複数のファイルでインクルードして使用するとき

/////hoge.h内/////
#ifndef __HOGE_H__
#define __HOGE_H__

関数のプロトタイプ宣言など

#endif

みたいにすれば再定義を避けられことは知っているのですが、学校では分割コンパイラのためその方法が使えないみたいです。
その場合は自分で再定義されないよう気をつけてインクルードするしかないのでしょうか?
それとも複数のファイルで同じヘッダファイルをインクルードしても再定義を避けられる方法が何かあるのでしょうか?

Re: 分割コンパイルでの再定義の避け方教えてください

Posted: 2011年7月12日(火) 00:51
by 1964
ペキロゲン さんが書きました:再定義によるエラー( multiple definition )が出てしまいました。
例えば"hoge.h"というヘッダファイルで関数の宣言をして、そのヘッダファイルを複数のファイルでインクルードして使用するとき

/////hoge.h内/////
#ifndef __HOGE_H__
#define __HOGE_H__

関数のプロトタイプ宣言など

#endif

みたいにすれば再定義を避けられことは知っているのですが、学校では分割コンパイラのためその方法が使えないみたいです。
ソースを複数ファイルに分けてコンパイルしているという事でしょうか。
だとすると分割コンパイルですね。
※分割コンパイラってコンパイラが分かれているのでしょうか。2パスや3パスのそれぞれの処理の事かな。

その技法が分割コンパイルで使えないという事はありませんよ。
標準ヘッダの多くもその技法を用いて再定義によるエラーなどを回避してます。
大抵の開発は分割コンパイルですし、C言語の標準ヘッダを読み込んで使っても問題起こりませんので。
問題は別のところにあると思います。

ペキロゲン さんが書きました:その場合は自分で再定義されないよう気をつけてインクルードするしかないのでしょうか?
それとも複数のファイルで同じヘッダファイルをインクルードしても再定義を避けられる方法が何かあるのでしょうか?
問題になっている部分をお書きになると良いのでは。
前述の通り、技法としてはご存知だという方法で問題なく使えるはずですが、別のところに誤解・理解不足がありそうな気がします。

Re: 分割コンパイルでの再定義の避け方教えてください

Posted: 2011年7月12日(火) 01:39
by ペキロゲン
回答ありがとうございます。
分割コンパイルうんぬんの件はネットで調べたとこに書いていたもので間違いかもしれませんでした。
しかしやはりこの技法を行ってもエラーは消えません。


今の現状としては
hoge.h、main.c、test1.c、test2.c、test3.c があったとして

hoge.h内に

#ifndef __HOGE_H__
#define __HOGE_H__

void function1();
void function2();
void function3();

#endif

と書いた場合(関数の中身はどこかに記載しておいたとする)
これらの関数を全てのファイルにて使いたいが、全てのファイルで
#include"hoge.h"
と書くと、一番初めにコンパイルされるファイル以外(今回の場合main.c以外)で先ほどのエラーが出てきます。

ここである一つのファイル以外(一番初めにその関数を使うファイル)で、#include"hoge.h"を消してやると問題なく動くといった感じです。

Re: 分割コンパイルでの再定義の避け方教えてください

Posted: 2011年7月12日(火) 02:30
by ISLe
関数プロトタイプはいくら重複してもエラーにはなりませんよ。

再定義とみなされているものはエラーメッセージに書かれているはずですが、それが何かを当てて欲しいのでしょうか。
試されてます?

Re: 分割コンパイルでの再定義の避け方教えてください

Posted: 2011年7月12日(火) 04:02
by ペキロゲン
すみません色々と勘違いしてました;
上記では関数の中身はどこかに記載すると書いていましたが、どうやらその中身をプロトタイプ宣言のすぐ下に書いていたことがいけなかったみたいです。
課題で使用して良いファイルが指定されているためヘッダファイルに全部書いてましたが、その関数の中身を別のファイルに書いてやるとそのエラーはおきなくなりました。
とりあえず中身だけ適当なあるファイルに書いてやることでエラーは避けられ解決できました。
ありがとうございましたm(_ _)m