0

私の質問は直接的な例にリンクしていませんが、全体としてはより多くの質問です。C++ でコーディングしていたとき、(いくつかのスレッドを調べた後) 同じプロジェクト内の別のファイルから関数を使用するには、ヘッダー ファイルが必要であることがわかりました。たとえば、「main.cpp」というファイルにメイン関数があり、「problem1.cpp」という別のファイルで関数「prob1()」を使用したい場合、ヘッダーを使用する必要があります。ファイル。

私を混乱させているのは、C でのプログラミングでこれを心配する必要がないのはなぜですか? C でプログラミングしていたとき、別のファイルから関数を使用するために、関数を直接呼び出すことができました。

ヘルプ/説明をいただければ幸いです。ありがとう!

4

2 に答える 2

3

C コンパイラは関数を暗黙的に宣言できますが、自分で行う必要があります。警告を表示すると、次のように表示されます。

file1.c: warning: implicit declaration of function ‘func_from_f2’

file1.cがコンパイルされると、この暗黙の宣言を使用してオブジェクト ファイルが作成されます。リンクするときは、オブジェクト ファイルが正常にリンクされるように、関数が実際に存在し、宣言が正しいことを期待する必要があります。

そうでない場合、リンカーは次の行のどこかでエラーを返します。

undefined reference to `func_from_f2'


また、ヘッダー ファイルは必ずしも必要ではありません。関数の宣言/prototype をソース ファイルに含めるだけでかまいません (#includeディレクティブが基本的にこれを行います)。すなわち。以下は、警告なしで正常に動作します。

file1.c

void func_from_f2(void);

int main(void)
{
   func_from_f2();

   return 0;
}

file2.c

#include <stdio.h>

void func_from_f2(void)
{
   puts("hello");
}


ただし、通常はヘッダー ファイルを使用するのがベスト プラクティスです。

file1.c

#include "file2.h"

int main(void)
{
   func_from_f2();

   return 0;
}

file2.h

#ifndef FILE2_H
#define FILE2_H

void func_from_f2(void);

#endif

file2.c

#include <stdio.h>
#include "file2.h"

void func_from_f2(void)
{
   puts("hello");
}
于 2012-06-05T03:55:03.993 に答える
2

C では、プロトタイプが提供されていない場合、コンパイラは正しいプロトタイプを推測します。多くの場合、間違った推測をすると、プログラムが壊れます。

C であれ C++ であれ#include、コンパイラが不一致をチェックできるように、実装ファイルにも d を取得するヘッダー ファイルに宣言を入れることは常に良い考えです。

于 2012-06-05T03:43:53.430 に答える