C語言中的原始檔和include 檔案

2021-07-05 05:38:23 字數 1255 閱讀 2111



一、原始檔如何根據#include來關聯標頭檔案

1,系統自帶的標頭檔案用尖括號括起來,這樣編譯器會在系統檔案目錄下查詢。 #include <>

2,使用者自定義的檔案用雙引號括起來,編譯器首先會在使用者目錄下查詢,然後在到c++安裝目錄(比如vc中可以指定和修改庫檔案查詢路徑,unix和linux中可以通過環境變數來設定)中查詢,最後在系統檔案中查詢。 #include 「***.h」 

二、標頭檔案如何來關聯原始檔 

這個問題實際上是說,已知標頭檔案「a.h」宣告了一系列函式,「b.cpp」中實現了這些函式,那麼如果我想在「c.cpp」中使用「a.h」中宣告的這些在「b.cpp」中實現的函式,通常都是在「c.cpp」中使用#include 「a.h」,那麼c.cpp是怎樣找到b.cpp中的實現呢? 

其實.cpp和.h檔名稱沒有任何直接關係,很多編譯器都可以接受其他副檔名。比如偶現在看到偶們公司的源**,.cpp檔案由.cc檔案替代了。 

在turbo c中,採用命令列方式進行編譯,命令列引數為檔案的名稱,預設的是.cpp和.h,但是也可以自定義為.***等等。 譚浩強老師的《c程式設計》一書中提到,編譯器預處理時,要對#include命令進行「檔案包含處理」:將file2.c的全部內容複製到#include 「file2.c」處。這也正說明了,為什麼很多編譯器並不care到底這個檔案的字尾名是什麼----因為#include預處理就是完成了乙個「複製並插入**」的工作。 編譯的時候,並不會去找b.cpp檔案中的函式實現,只有在link的時候才進行這個工作。我們在b.cpp或c.cpp中用#include 「a.h」實際上是引入相關宣告,使得編譯可以通過,程式並不關心實現是在**,是怎麼實現的。原始檔編譯後成生了目標檔案(.o或.obj檔案),目標檔案中,這些函式和變數就視作乙個個符號。在link的時候,需要在makefile裡面說明需要連線哪個.o或.obj檔案(在這裡是b.cpp生成的.o或.obj檔案),此時,聯結器會去這個.o或.obj檔案中找在b.cpp中實現的函式,再把他們build到makefile中指定的那個可以執行檔案中。 

在unix下,甚至可以不在原始檔中包括標頭檔案,只需要在makefile中指名即可(不過這樣大大降低了程式可讀性,是個不好的習慣哦^_^)。在vc中,一幫情況下不需要自己寫makefile,只需要將需要的檔案都包括在project中,vc會自動幫你把makefile寫好。 通常,編譯器會在每個.o或.obj檔案中都去找一下所需要的符號,而不是只在某個檔案中找或者說找到乙個就不找了。因此,如果在幾個不同檔案中實現了同乙個函式,或者定義了同乙個全域性變數,鏈結的時候就會提示「redefined」。    

c語言中的 c檔案和 h檔案

大神的詳細解讀 傳送門 記錄下一點點自己對兩個檔案的理解 函式宣告可以有多分,但函式定義只能有乙份。所以一般不在標頭檔案裡面定義函式,因為同乙個程式的多個 檔案可能都會包含這個標頭檔案。但c 中的inline函式是個例外,得定義在標頭檔案中。為了能夠擴充套件inline函式的內容,在每個呼叫點上,編...

如何在c語言中原始檔呼叫另乙個原始檔的函式

在原始檔a1.c中呼叫a2.c 中的函式 有兩種方法 1.在a2.c中有完整的函式定義,在a1.c中新增一下要用到的函式原型 宣告 就可以了,例如 在a2.c中 有函式void a2 在a1.c中 在檔案前頭增加一行 void a2 就可以了 2.把a2.c中完整定義的函式的原型,寫到乙個a2.h檔...

c語言中的檔案

用電腦程式解決實際問題時,在待處理豁得出結果的資料量較大情況下,一般採用讀寫外部儲存介質 如光碟,磁碟,u盤 中的資料。資料一般是以檔案組織的形式儲存。因此,讀寫資料就是讀寫外存中的檔案資料。檔案的定義 相關資料的集合。計算機中的程式資料,文件通常都組織成檔案存放在外儲存器中,由於輸入輸出裝置具有位...