C 中標頭檔案與原始檔的區別

2021-06-03 20:47:12 字數 1936 閱讀 7777

本文**:

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

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

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

#include 「"***.h」(我一直以為」」和<>沒什麼區別,但是tinyxml.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的全部內容複製到#includefile2.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中實現的函式,再把他們buildmakefile中指定的那個可以執行檔案中。

在unix下,甚至可以不在原始檔中包括標頭檔案,只需要在makefile中指名即可(不過這樣大大降低了程式可讀性,是個不好的習慣哦^_^)。在vc中,一幫情況下不需要自己寫makefile,只需要將需要的檔案都包括在project中,vc會自動幫你把makefile寫好。

通常,c++編譯器會在每個.o或.obj檔案中都去找一下所需要的符號,而不是只在某個檔案中找或者說找到乙個就不找了。因此,如果在幾個不同檔案中實現了同乙個函式,或者定義了同乙個全域性變數,鏈結的時候就會提示「redefined」。

綜上所訴:

.h檔案中能包含:

類成員資料的宣告,但不能賦值

類靜態資料成員的定義和賦值,但不建議,只是個宣告就好。

類的成員函式的宣告

非類成員函式的宣告

常數的定義:如:const int a=5;

靜態函式的定義

類的內聯函式的定義

不能包含:

1. 所有非靜態變數(不是類的資料成員)的宣告

2。 預設命名空間宣告不要放在標頭檔案,using namespace std;等應放在.cpp中,在.h檔案中使用std::string

C 中標頭檔案( h)和原始檔( cpp)寫法

這個問題在許多c 程式設計師看來會很搞笑,這麼簡單的問題還用得著你廢話!但是由於本人生性愚鈍,學c 的時候,確實花了很久的時間都搞不明白,只是會寫乙個檔案,但不會寫乙個工程。而用c 編寫比較大型的專案時,檔案的分割管理確實確實是非常必要的 下面就非常簡潔明瞭地談談標頭檔案 h 和原始檔 cpp 應該...

C 中標頭檔案的問題

在編c 時遇到的問題,庫函式strlen,strcmp的標頭檔案問題 include include include using namespace std 兩個都能正確編譯執行,string也是存在的,都是共存的 今天用到randomize 發現沒有了,查了一下,原來randomize 和rand...

C中標頭檔案的使用

最近在寫作業系統的時候,學習了作者的c 中標頭檔案的布置風格,記錄於此。可以有乙個檔案專門存放全域性變數 也有可能是一類檔案 然後對全域性變數的標頭檔案宣告,使用extern關鍵字。普通c檔案對應的標頭檔案.h中,主要存放結構體和巨集。能定義成巨集的盡量到相應的標頭檔案中定義成巨集,這有利於 的可讀...