1. ホーム
  2. c

[解決済み】C言語で多重定義を防ぐには?

2022-02-05 14:16:51

質問

C言語初心者なのですが、Code::Blocksでコンソールアプリケーションを書こうとしていたところです。以下はその(簡略化した)コードです。 main.c:

#include <stdio.h>
#include <stdlib.h>
#include "test.c" // include not necessary for error in Code::Blocks

int main()
{
    //t = test(); // calling of method also not necessary
    return 0;
}

test.c:

void test() {}

このプログラムをビルドしようとすると、以下のようなエラーが発生します。

*path*test.c|1|multiple definition of `_ test'|。
objDebug: *path*test.c|1|first defined here|.

testを多重定義しているわけでもなく(アンダースコアがどこから出ているのかわかりませんが)、何らかの方法で2回定義が含まれている可能性は極めて低そうです。あるのはこのコードだけです。

このエラーは、他の関数やファイルが test や test.c と呼ばれていることによる命名の衝突が原因であると断定しました。

どなたか、この原因と対処法をご存知の方はいらっしゃいますか?ありがとうございます。

解決方法を教えてください。

のソースコードを実際にコンパイルしてみます。 test.c を2回実行します。

  • 1回目のコンパイル時 test.c そのものです。
  • 2回目のコンパイル時 main.c を含むすべての test.c のソースになります。

に必要なもの main.c を使用するために test() 関数は単純な宣言であり、その定義ではない。これを実現するには test.h のようなものを含むヘッダーファイルがあります。

void test(void);

これは、入力パラメータと戻り値の型を持つこのような関数が存在することをコンパイラに知らせるものである。この関数が行うこと( {} ) が残されています。 test.c ファイルを作成します。

main.c で #include "test.c"#include "test.h" .

最後に、プログラムが複雑になると、ヘッダーファイルが何度もインクルードされる事態に直面します。これを防ぐために、ヘッダーソースは特定のマクロ定義で囲まれていることがあります。

#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED

void test(void);

#endif