標頭檔案和原始檔的區別

2021-08-21 18:23:51 字數 1315 閱讀 8106

**:

一、原始檔如何根據#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」。

標頭檔案和原始檔的區別

一 原始檔如何根據 include來關聯標頭檔案 1,系統自帶的標頭檔案用尖括號括起來,這樣編譯器會在系統檔案目錄下查詢。include 2,使用者自定義的檔案用雙引號括起來,編譯器首先會在使用者目錄下查詢,然後在到c 安裝目錄 比如vc中可以指定和修改庫檔案查詢路徑,unix和linux中可以通過...

標頭檔案和原始檔的區別

一 原始檔如何根據 include來關聯標頭檔案 1,系統自帶的標頭檔案用尖括號括起來,這樣編譯器會在系統檔案目錄下查詢。include 2,使用者自定義的檔案用雙引號括起來,編譯器首先會在使用者目錄下查詢,然後在到c 安裝目錄 比如vc中可以指定和修改庫檔案查詢路徑,unix和linux中可以通過...

標頭檔案和原始檔

一.例1 test.h void show test.cpp include using namespace std void show includeproblem.cpp include test.h int main 可以看到 includeproblem.cpp檔案彙總 include te...