コードが別のファイルにある場合、なぜヘッダーファイルを追加する必要があるのか理解できません。
ヘッダーファイルには、他のファイルで定義されている関数の宣言が含まれています。これは、関数を呼び出しているコードが正しくコンパイルされるために必要です。
たとえば、次のコードを記述したとします。
int main(void)
{
double *foo = malloc(sizeof *foo * 10);
if (foo)
{
// do something with foo
free (foo);
}
return 0;
}
malloc
は、メモリを動的に割り当て、そのメモリへのポインタを返す標準ライブラリ関数です。の戻り型malloc
は、でありvoid *
、その任意の値を他のポインタ型に割り当てることができます。 free
は、を介して割り当てられたメモリの割り当てを解除する別の標準ライブラリ関数でmalloc
あり、その戻りタイプはvoid
(IOW、戻り値なし)です。
ただし、コンパイラーは、何を自動的に認識したり、何を返すか(または返さないかmalloc
)free
を認識しません。関数呼び出しを正しく変換する前に、現在のスコープ内の両方の関数の宣言を確認する必要があります。C89標準以前では、スコープ内の宣言なしで関数が呼び出された場合、コンパイラーは関数がint
;を返すと想定します。int
と互換性がないためdouble *
(キャストなしで一方を他方に直接割り当てることはできません)、「互換性のない割り当て」診断が表示されます。C99以降では、暗黙の宣言はまったく許可されていません。いずれにせよ、コンパイラはコードを変換しません。
行を追加する必要があります
#include <stdlib.h>
これには、ファイルの先頭へのand (およびその他の多くのもの) の宣言が含まれます。malloc
free
関数定義(または変数定義)をヘッダーファイルに入れたくない理由はいくつかあります。foo
ヘッダーで関数を定義するとします。aha.h
ファイルa.c
とにインクルードしますb.c
。各ファイルは個別に正常にコンパイルされますが、ライブラリまたは実行可能ファイルを構築するためにそれらをリンクしようとすると、リンカーから「複数の定義」エラーが発生します。同じ名前、それはノーノーです。変数の定義 についても同じことが言えます。
また、スケーリングもうまくいきません。多数の関数を独自のヘッダーファイルに配置し、それらを1つのソースファイルに含めると、それらすべての関数を1つの大きなグロブに変換することになります。さらに、ソースファイルまたは1つのヘッダーファイルのコードのみを変更した場合でも、.cファイルを再コンパイルするたびにすべてを再コンパイルすることになります。各関数を独自の.cファイルに配置することで、再コンパイルが必要なファイルを再コンパイルするだけで、全体的なビルド時間を短縮できます。