それはすべてタイトルにあります。非常に単純だと思いますが、構文上のものをどこでも検索するのは非常に困難です。
これらは、私がCS50.netからコピーした 2 つのライブラリ ファイルであり、なぜ 2 つの異なる拡張子が付いているのか疑問に思っています。
.c : c ファイル (一般に、実際のアクションがある場所)
.h : ヘッダー ファイル (プリプロセッサ#include
ディレクティブに含める)。関数プロトタイプ、#define されたもの、グローバル変数の extern 宣言 (ああ、恐ろしい) など、通常はコードの他の部分と共有されると見なされるものを含みます。
技術的には、すべてを 1 つのファイルに入れることができます。C プログラム全体。百万行。しかし、私たち人間は物事を整理する傾向があります。したがって、それぞれが特定の関数を含む異なる C ファイルを作成します。それはすべて素晴らしくてきれいです。次に突然、特定の C ファイルにある宣言が別の C ファイルにも存在する必要があることに気付きます。したがって、それらを複製します。したがって、最善の方法は、宣言を抽出して、.h である共通ファイルに入れることです。
たとえば、cs50.h には、関数の「前方宣言」と呼ばれるものがあります。前方宣言は、関数の呼び出し方法 (入力パラメーターなど) とその戻り値をコンパイラーに伝えるための簡単な方法です。文句を言います)。
もう一つの例。正規表現マッチングを実行する関数を含む .c ファイルを作成するとします。関数で、正規表現、照合する文字列、および比較で大文字と小文字を区別する必要があるかどうかを示すパラメーターを受け入れる必要があります。
したがって、.cに
bool matches(string regexp, string s, int flags) { the code }
ここで、次のフラグを渡したいとします。
0: 検索で大文字と小文字が区別される場合
1: 検索で大文字と小文字が区別されない場合
そして、あなたは新しいフラグに自分自身を開いたままにしたいので、ブール値を入れませんでした. 数字で遊ぶのは難しいので、これらのフラグに便利な名前を定義します
#define MATCH_CASE_SENSITIVE 0
#define MATCH_CASE_INSENSITIVE 1
プログラムがこれらのラベルを使用したい場合、情報を含めない限り、それらを知る方法がないため、この情報は .h に入ります。もちろん、それらを .c に入れることもできますが、そうすると .c コード (全体!) を含める必要があり、時間の無駄であり、問題の原因となります。
もちろん、ヘッダー ファイル.h
の拡張子は必ず .C ソース ファイルの拡張子は.c
. これらは便利な規則です。
E:\Temp> type my.interface
#ifndef MY_INTERFACE_INCLUDED
#define MYBUFFERSIZE 8
#define MY_INTERFACE_INCLUDED
#endif
E:\Temp> type my.source
#include <stdio.h>
#include "my.interface"
int main(void) {
char x[MYBUFFERSIZE] = {0};
x[0] = 'a';
puts(x);
return 0;
}
E:\Temp> gcc -x c my.source -o my.exe
E:\Temp> my
a
それらは実際にはライブラリ ファイルではありません。それらは単なるソースファイルです。Stefano が言ったように、.cファイルは C ソース ファイルであり、 .hファイルで概説しただけの実際のソース、ヘッダー ファイルを実際に使用/定義します。通常、ヘッダー ファイルには、実際のソース ファイルで使用されるすべての関数プロトタイプと構造体の概要が記述されています。リファレンス/付録のように考えてください。これは、ヘッダー ファイルを見れば明らかです:) したがって、これらのソース ファイルに記述されたものを使用する場合は#include
、コンパイラーが知る必要がある情報を含むヘッダー ファイルを使用します。
.c はソース ファイルで、.h はヘッダー ファイルです。
.c ファイルは、コンパイルされるソース ファイルです。.h ファイルは、プログラムの API をそのプログラムの他の部分、またはライブラリを作成している他のプログラムに公開するために使用されます。
たとえば、PizzaDelivery プログラムには、メイン プログラムを含む 1 つの .c ファイルと、ユーティリティ関数を含む 1 つの .c ファイルを含めることができます。ここで、プログラムの主要部分でユーティリティ関数を使用できるようにするには、関数プロトタイプを介して API を .h ファイルに公開する必要があります。この .h ファイルは、メインの .c ファイルに含まれています。
.c : 'C' source code
.h : Header file
通常、.c
ファイルには実装が含まれ、ファイルには実装.h
の「インターフェース」が含まれます。