2009-11-08 13 views

答えて

78

.C:(実際の行動は、一般に、である)、Cファイル

.H:ヘッダファイル(プリプロセッサ#includeディレクティブで含まれるように)。関数プロトタイプ、#define'd stuff、グローバル変数のextern宣言(ああ、ホラー)などのように、コードの他の部分と通常は共有されているとみなされるものが含まれています。

技術的には、すべてを1つのファイルに入れることができます。全体のCプログラム。百万の行。しかし人間は物事を整理する傾向があります。つまり、それぞれ異なる機能を持つ異なるCファイルを作成します。それはすてきで清潔です。そして、突然、宣言は、あるCファイルが別のCファイルにも存在するはずです。だからあなたはそれらを複製するでしょう。したがって、宣言を抽出して共通ファイル(.h

)に入れます。

たとえば、cs50.hでは、関数の「前方宣言」が見つかります。 前方宣言は、関数がどのように呼び出されるべきか(例えば、どの入力パラメータ)と返されるかをコンパイラに知らせるための適切なチェックを実行するための簡単な方法です(例えば、それは文句を言うだろう)。

もう1つの例です。正規表現マッチングを実行する関数を含む.cファイルを作成するとします。関数が正規表現を受け入れるようにするには、一致させる文字列と、比較で大文字小文字を区別しないかどうかを示すパラメータを指定します。あなたはそのため今

bool matches(string regexp, string s, int flags) { the code } 

を入れます.Cで

、あなたは以下のフラグを渡したいと仮定します。

0:検索で大文字

1敏感である場合には、次の場合検索は大文字と小文字を区別しません。

あなたは新しいフラグを開いておきたいので、ブール値を入れませんでした。数字で遊んで は難しいですので、あなたは、これらのフラグのために便利な名前を定義

#define MATCH_CASE_SENSITIVE 0 
#define MATCH_CASE_INSENSITIVE 1 

任意のプログラムは、これらのラベルを使用したい場合、それはあなたが含まれていない限り、それらを知る方法がないので、この情報は、.hのに入ります情報もちろん、それらを.cに入れることもできますが、時間の無駄やトラブルの原因となる.cコード(全体!)を含める必要があります。

+0

これは間違いです。今すぐヘッダファイルが何を参照するか調べてみてください... –

+0

これはまた役立ちます:これはまた役立ちます:http://stackoverflow.com/questions/3482948/any-fundamental-difference-between-source-and-header -files-in-c。同じものはたくさんありますが、やや異なる方法を説明しました。 – spugm1r3

0
.c : 'C' source code 
.h : Header file 

は通常、.cファイルは実装が含まれている、と.hファイルは、インプリメンテーションの「インターフェース」が含まれています。

5

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

+0

よい清算、ありがとう。だから、私はを#includeしますが、それは次にcs50.cから必要な実際の関数を呼び出します。これは私がファイルを読むことから想定したものです、これは正しいですか? –

+1

それは通常どのように行くのです。しかし、#include のように#は通常コンパイラに付属のファイルのために予約されています。#include "cs50.h"は、コンパイラがどこかにアクセスできることを確認してください。 。 –

+0

正しく覚えていれば、 ""の使用はお勧めしません。 yuは常に<>を使用し、-Iを適切に調整する必要があります。 –

1

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

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

12

もちろん、ヘッダファイルの拡張子は.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 
+2

ありがとうございます!私は拡張子 '.h'と' .c'が必須だと思っていました。 –

0

は、IDEは、他の人からあなたのファイルを検索し、明瞭するために、それは難しいだろうuは.Cしてファイルを保存していない場合は、コマンドプロンプトからか、その後の任意のIDEを使用して作成したCプログラムを開くことがあるとし検索が遅れることになります。ですから、.cは.javaなどのファイルの種類とそのソースを示します。

関連する問題