web-dev-qa-db-ja.com

.cおよび.hファイル拡張子はCにとって何を意味しますか?

タイトルにすべて含まれています。私は非常にシンプルだと思いますが、構文的なものをどこでも検索するのはとても難しいです。

これらは、私が CS50.net からコピーしている2つのライブラリファイルであり、なぜ2つの異なる拡張子を持つのか疑問に思っています。

50
Alex Mcp

.c:cファイル(実際のアクションは、一般的な場所です)

.h:ヘッダーファイル(プリプロセッサに含まれる#includeディレクティブ)。関数のプロトタイプ、#define'd stuff、グローバル変数のextern宣言(oh、the horror)など、通常コードの他の部分と共有されると見なされるものが含まれます。

技術的には、すべてを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コード(全体!)を含める必要があり、これは時間の無駄であり、トラブルの原因になります。

96
Stefano Borini

もちろん、ヘッダーファイルの拡張子は.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
17
Sinan Ünür

実際にはライブラリファイルではありません。それらは単なるソースファイルです。 Stefanoが言ったように、。cファイルはCソースファイルであり、ヘッダーファイルである。hファイルで単に説明されているものの実際のソースを実際に使用/定義します。通常、ヘッダーファイルは、実際のソースファイルで使用される関数プロトタイプと構造のすべての概要を示します。リファレンス/付録のように考えてください。これは、以下に示すように、ヘッダーファイルを見ると明らかです。これらのソースファイルに記述されたものを使用する場合は、#includeヘッダーファイル。コンパイラが知る必要のある情報が含まれています。

5

.cはソースファイルで、.hは ヘッダーファイル です。

2
hexium

.cファイルは、コンパイルされるソースファイルです。 .hファイルは、プログラムのAPIをそのプログラムの他の部分またはライブラリを作成している他のプログラムに公開するために使用されます。

たとえば、プログラムPizzaDeliveryには、メインプログラムが含まれる1つの.cファイルと、ユーティリティ関数が含まれる1つの.cファイルがあります。ここで、プログラムの主要部分がユーティリティ関数を使用できるようにするには、APIを関数プロトタイプを介して.hファイルに公開する必要があります。この.hファイルはメイン.cファイルに含まれています。

1
Nicolas Goy
.c : 'C' source code
.h : Header file

通常、.cファイルには実装が含まれ、.hファイルには、実装の「インターフェース」が含まれています。

0
AraK