2009-11-08 15 views

回答

78

.C:C文件(其中實際的行動是,在一般情況)

.H:頭文件(將包含在一個預處理器#include指令)。包含通常被認爲與代碼的其他部分共享的東西,比如函數原型,#define'd stuff,全局變量的extern聲明(哦,恐怖)等。

從技術上講,您可以將所有內容放在一個文件中。一個完整的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代碼(整個!),這是浪費時間和麻煩的根源。

+0

沒有,這是正確的。現在我只是去查找頭文件是什麼... – 2009-11-08 03:08:29

+0

這也可能有所幫助:這也可能有所幫助:http://stackoverflow.com/questions/3482948/any-fundamental-difference-between-source-and-header -files-在-C。很多都一樣,但解釋方式稍有不同。 – spugm1r3 2016-09-17 20:08:04

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

通常,.c文件包含的實施,.h文件包含一個實現的「接口」。

5

它們不是真正的庫文件。他們只是源文件。像斯特凡諾說的那樣,。c文件是C源文件,它實際使用/定義了它僅在.h文件(頭文件)中列出的實際源文件。頭文件通常概述將在實際源文件中使用的所有函數原型和結構。把它想象成一個參考/附錄。這在看到頭文件時很明顯,因爲你會看到:)所以當你想使用在這些源文件中編寫的東西時,頭文件包含編譯器需要知道的信息。

+0

很好的說明,謝謝。所以我#include ,但然後又調用它從cs50.c所需的實際功能。這是我通過閱讀文件所假設的,這是正確的嗎? – 2009-11-08 03:12:57

+1

是的,這通常是怎麼回事。但是,#include 通常保留給編譯器附帶的文件,例如#include 您想要的是#include「cs50.h」,並確保它位於編譯器可訪問的某處,最好是其他源文件在其中。 – 2009-11-08 03:15:42

+0

如果我沒有記錯,使用「」是不鼓勵的。 yu應該始終使用<>並適當調整-I。 – 2009-11-08 03:33:52

1

.c文件是將被編譯的源文件。 .h文件用於將程序的API暴露給該程序的其他部分或其他程序是否正在創建庫。

例如,PizzaDelivery程序可以包含1.c文件和主程序,以及1 .c文件和實用程序功能。現在,要使程序的主要部分能夠使用實用程序功能,您需要通過函數原型將API公開到.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'是強制性的,我從來沒有想過! – 2017-02-16 20:34:30

0

假設你必須從命令提示符下或使用任何IDE然後如果u沒有保存的.C文件打開你創建的C程序那麼這將是困難的IDE搜索和不同的文件從別人這將推遲搜索。所以.c告訴文件的類型和它的來源,比如.java和其他文件。