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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ペキロゲン

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

#1

投稿記事 by ペキロゲン » 14年前

今学校でC言語で課題をやっているのですが、再定義によるエラー( multiple definition )が出てしまいました。
例えば"hoge.h"というヘッダファイルで関数の宣言をして、そのヘッダファイルを複数のファイルでインクルードして使用するとき

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

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

#endif

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

1964
記事: 5
登録日時: 14年前

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

#2

投稿記事 by 1964 » 14年前

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

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

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

#endif

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

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

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

ペキロゲン

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

#3

投稿記事 by ペキロゲン » 14年前

回答ありがとうございます。
分割コンパイルうんぬんの件はネットで調べたとこに書いていたもので間違いかもしれませんでした。
しかしやはりこの技法を行ってもエラーは消えません。


今の現状としては
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"を消してやると問題なく動くといった感じです。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#4

投稿記事 by ISLe » 14年前

関数プロトタイプはいくら重複してもエラーにはなりませんよ。

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

ペキロゲン

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

#5

投稿記事 by ペキロゲン » 14年前

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

閉鎖

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