実際に test.c
のソースコードをコンパイルします 2 回:
test.c
を初めてコンパイルするとき それ自体、main.c
をコンパイルするときの 2 回目 すべてのtest.c
を含む ソース。
main.c
に必要なもの test()
を使用するには function は単純な宣言であり、その定義ではありません。これは 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
アンダースコアはコンパイラによってそこに置かれ、リンカによって使用されます。基本的なパスは次のとおりです:
main.c
test.h ---> [compiler] ---> main.o --+
|
test.c ---> [compiler] ---> test.o --+--> [linker] ---> main.exe
したがって、メイン プログラムには、関数プロトタイプなどの宣言のみで構成されるテスト モジュールのヘッダー ファイルを含める必要があります。
void test(void);
これにより、コンパイラは、main.c がコンパイルされているときにそれが存在することを認識できますが、実際のコードは test.c、次に test.o にあります。
2 つのモジュールを結合するのはリンク フェーズです。
test.c を main.c にインクルードすることで、main.o で test() 関数を定義していることになります。次に、関数 test() を含む main.o と test.o をリンクしていると思われます。
.c ファイルに他のソース ファイル (*.c) を含めないでください。ヘッダーが必要だと思います ( .h) テスト関数の宣言を含むファイルを作成し、その定義を別の .c ファイルに含めます。
エラーは、テスト関数の複数の定義 (test.c に 1 つと main.c にもう 1 つ) によって引き起こされます