最近、ヘッダーファイルを使用して、プログラムを個別のファイルに分割しています(関数を含むCファイルと、それらを宣言するヘッダーファイル)。すべてが正常に機能しますが、何らかの理由で、すべてのCファイルにインクルードする必要があり<stdio.h>
ます<stdlib.h>
...そうしないと、プロジェクトのコンパイルに失敗します。これは予想される動作ですか?
3 に答える
C モジュールは、何かがどのように定義されているか、または定義を見つけることができる場所のいずれかを知る必要があります。定義がヘッダー ファイルにある場合は、それを使用するモジュールに含める必要があります。ヘッダー ファイルに関する情報へのリンクを次に示します。
それらは何らかの方法で含める必要があります。
一部のプロジェクトでは、.c ファイルにインクルードの長いリストが必要であり、ソートが必須である可能性があり、ヘッダーに他のヘッダーが含まれていないという仮定を強制することさえあります。
一部のインクルードが一部のヘッダーから含まれていると想定できるものもあります。
コレクション ヘッダー (小さなヘッダーのリストを含む) を使用し、長いリストをそれらに置き換えます。
コンパイラの「強制ヘッダー」オプションを使用してさらに進んだものもあるため、インクルードはどこにも表示されず、コンテンツが暗黙的に想定されることを宣言します。それは、プロジェクトまたはコードベース全体のレベル、または組み合わせて行うことができます。プリコンパイル済みヘッダーでうまく機能します。
(さらに多くの戦略があり、すべて長所と短所があります。)
答えは、その関数が他の .c/.h ファイルで宣言された他の関数に依存するかどうかによって異なります。
例えば:
filea.c
:
#include "filea.h";
methodA()
{
methodB();
}
fileb.c
:
#include <somelibrary.h>
#include "fileb.h"
methodB();
{
somelibrarycode();
}
解決されていない外部依存関係があるfilea.c
ため、ヘッダーが含まれていない限り、これはコンパイルされません。fileb.h
これがあなたが説明しているものではない場合は、他のスパゲッティ化が起こっているか、誤って静的に型付けされた関数が.c
ファイルの外に表示されないようにしています。
この問題の 1 つの可能な解決策はshared.h
、他のすべてのインクルードを 1 つにすることですが、個人的にはお勧めしません。これは、どのファイルが何に依存しているかを明確にするのではなく、問題を覆い隠すだけだからです。