標頭檔案和原始檔在本質上沒有任何區別。 只不過一般:字尾為
.h
.c
簡單的說其實要理解C檔案與標頭檔案(即
①預處理階段
②詞法與語法分析階段
④連線階段,將各個目標檔案中的各段程式碼進行絕對地址定位,生成跟特定平臺相關 的可執行檔案,當然,最後還可以用objcopy生成純二進位制碼,也就是去掉了檔案格 式信 息。(生成
.exe
3.比方說 在
aaa.h
aaa.c
myproj.c
mylib.h
.cpp
mylib.c
.lib
標頭檔案和原始檔在本質上沒有任何區別。 只不過一般:字尾為
.h
的檔案是標頭檔案,內含函式宣告、宏定義、結構體定義等內容。字尾為.c
的檔案是原始檔,內含函式實現,變數定義等內容。而且是什麼字尾也沒有關係,只不過編譯器會預設對某些字尾的檔案採取某些動作。這樣分開寫成兩個檔案是一個良好的程式設計風格。簡單的說其實要理解C檔案與標頭檔案(即
.h
)有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程:①預處理階段
②詞法與語法分析階段
檔案)④連線階段,將各個目標檔案中的各段程式碼進行絕對地址定位,生成跟特定平臺相關 的可執行檔案,當然,最後還可以用objcopy生成純二進位制碼,也就是去掉了檔案格 式信 息。(生成
.exe
檔案)3.比方說 在
aaa.h
裡定義了一個函式的宣告,然後在aaa.h
的同一個目錄下建立aaa.c
,aaa.c
裡定義了這個函式的實現,然後是在main函式所在.c
檔案裡#include這個aaa.h
然後我就可以使用這個函數了。 main在執行時就會找到這個定義了這個函式的aaa.c
檔案。這是因為:main函式為標準C/C++的程式入口,編譯器會先找到該函式所在的檔案。假定編譯程式編譯myproj.c
(其中含main())時,發現它include了mylib.h
(其中聲明瞭函式void test()),那麼此時編譯器將按照事先設定的路徑(Include路徑列表及程式碼檔案所在的路徑)查詢與之同名的實現檔案(副檔名為.cpp
或.c
,此例中為mylib.c
),如果找到該檔案,並在其中找到該函式(此例中為void test())的實現程式碼,則繼續編譯;如果在指定目錄找不到實現檔案,或者在該檔案及後續的各include檔案中未找到實現程式碼,則返回一個編譯錯誤.其實include的過程完全可以“看成”是一個檔案拼接的過程,將宣告和實現分別寫在標頭檔案及C檔案中,或者將二者同時寫在標頭檔案中,理論上沒有本質的區別。以上是所謂動態方式。對於靜態方式,基本所有的C/C++編譯器都支援一種連結方式被稱為Static Link,即所謂靜態連結。在這種方式下,我們所要做的,就是寫出包含函式,類等等宣告的標頭檔案(a.h,b.h,...),以及他們對應的實現檔案(a.cpp,b.cpp,...),編譯程式會將其編譯為靜態的庫檔案(a.lib,b.lib,...)。在隨後的程式碼重用過程中,我們只需要提供相應的標頭檔案(.h
)和相應的庫檔案(.lib