私の(限られた-通常はC開発者ではない)理解では、これはCに根ざしています。Cはクラスまたは名前空間が何であるかを知らないことに注意してください。これは1つの長いプログラムです。また、使用する前に関数を宣言する必要があります。
たとえば、次の場合はコンパイラエラーが発生します。
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
エラーは、宣言の前に呼び出すため、「SomeOtherFunctionは宣言されていません」である必要があります。これを修正する1つの方法は、SomeOtherFunctionをSomeFunctionの上に移動することです。別のアプローチは、最初に関数のシグネチャを宣言することです:
void SomeOtherFunction();
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
これにより、コンパイラーは次のことを知ることができます。コードのどこかに、SomeOtherFunctionという名前の関数があり、これはvoidを返し、パラメーターを受け取りません。そのため、SomeOtherFunctionを呼び出そうとするコードを検出した場合、パニックにならずに、代わりにコードを探してください。
ここで、2つの異なる.cファイルにSomeFunctionとSomeOtherFunctionがあるとします。次に、Some.cに#SomeOther.cを含める必要があります。次に、いくつかの「プライベート」関数をSomeOther.cに追加します。Cはプライベート関数を知らないので、その関数はSome.cでも使用できます。
これが.hファイルの出所です。他の.cファイルからアクセスできる.cファイルから「エクスポート」するすべての関数(および変数)を指定します。そうすることで、Public / Privateスコープのようなものが得られます。また、ソースコードを共有しなくても、この.hファイルを他の人に渡すことができます。.hファイルは、コンパイルされた.libファイルに対しても機能します。
したがって、主な理由は、本当に便利で、ソースコードを保護し、アプリケーションの部分を少し分離するためです。
それはCでした。C ++はクラスとプライベート/パブリック修飾子を導入したので、それらが必要かどうかを尋ねることはできますが、C ++ AFAIKはそれらを使用する前に関数の宣言を必要とします。また、多くのC ++開発者はCデベロッパーでもあり、Cデベロッパーでもあり、その概念と習慣をC ++に引き継ぎました。