.c和.h檔案沒有必然聯絡,不一定非得成對存在,可單獨實現;.h標頭檔案存在的意義,方便c檔案的引用(避免重複)與描述。理論上來說c檔案與標頭檔案裡的內容,只要是c語言所支援的,無論寫什麼都可以的,比如你在標頭檔案中寫函式體,只要在任何乙個c檔案包含此標頭檔案就可以將這個函式編譯成目標檔案的一部分(編譯是以c檔案為單位的,如果不在任何c檔案中包含此標頭檔案的話,這段**就形同虛設)
作用:#include叫做「檔案包含」。它的功能是用來指定檔案的全部內容替換程式中的命令列,從而使指定的檔案與當前原始檔連成乙個原始檔。
1、#include 《stdio.h》
//系統到存放c庫函式標頭檔案的目錄中(/usr/include/)尋找要包含的檔案。2、#include 「hello.c」
//首先在原始檔的當前目錄中查詢,沒有則去系統庫找例如: #include」./spi/spi.c」
//指定檔案路徑也可以,只需編譯main的標頭檔案,否則就需要同時編譯幾個原始檔;
約定:頭件中進行函式,變數宣告,巨集宣告,結構體宣告; 在c檔案中去進行變數定義,函式實現
如果在標頭檔案中實現乙個函式體,那麼如果在多個c檔案中引用它,而且又同時編譯多個c檔案,將其生成的目標檔案連線成乙個可執行檔案,在每個引用此標頭檔案的c檔案所生成的目標檔案中,都有乙份這個函式的**,如果這段函式又沒有定義成區域性函式,那麼在連線時,就會發現多個相同的函式,就會報錯如果在標頭檔案中定義全域性變數,並且將此全域性變數賦初值,那麼在多個引用此標頭檔案的c檔案中同樣存在相同變數名的拷貝,關鍵是此變數被賦了初值,所以編譯器就會將此變數放入data段,最終在連線階段,會在data段中存在多個相同的變數,它無法將這些變數統一成乙個變數,也就是僅為此變數分配乙個空間,而不是多份空間,假定這個變數在標頭檔案沒有賦初值,編譯器就會將之放入bss段,聯結器會對bss段的多個同名變數僅分配乙個儲存空間如果在c檔案中宣告巨集,結構體,函式等,那麼我要在另乙個c檔案中引用相應的巨集,結構體,就必須再做一次重複的工作,如果我改了乙個c檔案中的乙個宣告,那麼又忘了改其它c檔案中的宣告,這不就出了大問題了,程式的邏輯就變成了你不可想象的了,如果把這些公共的東東放在乙個標頭檔案中,想用它的c檔案就只需要引用乙個就ok了!!!這樣豈不方便,要改某個宣告的時候,只需要動一下頭檔案就行了在標頭檔案中宣告結構體,函式等,當你需要將你的**封裝成乙個庫,讓別人來用你的**,你又不想公布原始碼,那麼人家如何利用你的庫呢?也就是如何利用你的庫中的各個函式呢??一種方法是公布原始碼,別人想怎麼用就怎麼用,另一種是提供標頭檔案,別人從頭檔案中看你的函式原型,這樣人家才知道如何呼叫你寫的函式,就如同你呼叫printf函式一樣,裡面的引數是怎樣的??你是怎麼知道的??還不是看人家的標頭檔案中的相關宣告啊!!!當然這些東東都成了c標準,就算不看人家的標頭檔案,你一樣可以知道怎麼使用
編譯時,並不會去找.c檔案的實現函式;只有在link時才進行這個工作。在link的時候,需要在makefile裡面說明需要連線那個.o或.obj檔案,此時聯結器會去找這個.o或.obj檔案中找到.c中實現的函式,再把他們build到makefile中指定的那個可以執行的檔案中。
在unix下,甚至可以不用在原始檔中包括標頭檔案,只需要在makefile中指明即可(不過這樣大大降低了程式可讀性,是個不好的習慣),在vc中會自動幫你makefile寫好。
通常,編譯器會在每個.o或.obj檔案中都去找一下所需要的符號,而不是只在某個檔案中找或者說找到乙個就不找了。因此,如果在幾個不同檔案中實現了同乙個函式,或者定義了同乙個全域性變數,鏈結的時候就會提示「redefined」。
c語言中 h檔案和 c檔案的關係
在編譯器只認識.c cpp 檔案,而不知道.h是何物的年代,那時的人們寫了很多的.c cpp 檔案,漸漸地,人們發現在很多.c cpp 檔案中的宣告語句就是相同的,但他們卻不得不乙個字乙個字地重複地將這些內容敲入每個.c cpp 檔案。但更為恐怖的是,當其中乙個宣告有變更時,就需要檢查所有的.c c...
C語言中C檔案與h標頭檔案的關係
簡單的說其實要理解c檔案與標頭檔案 即.h 有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程 1.預處理階段 2.詞法與語法分析階段 3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟cpu相關的二進位製碼,生成各個目標檔案 obj檔案 4.連線階段,將各個目標檔案中的...
c語言中的 c檔案和 h檔案
大神的詳細解讀 傳送門 記錄下一點點自己對兩個檔案的理解 函式宣告可以有多分,但函式定義只能有乙份。所以一般不在標頭檔案裡面定義函式,因為同乙個程式的多個 檔案可能都會包含這個標頭檔案。但c 中的inline函式是個例外,得定義在標頭檔案中。為了能夠擴充套件inline函式的內容,在每個呼叫點上,編...