關於 h頭件的一些總結

2021-05-12 23:22:17 字數 1194 閱讀 1406

總結一下,尚在戒菸還用買煙嗎?

.h檔案只為編譯器所需要,因為它要確保在.cpp或.c檔案(它要編譯的檔案,rc編譯器也需要.h檔案)中函式(應該說所有符號啦)被正確地使用,例如不能宣告乙個有返回值的函式而不返回,這當然會出現錯誤.再細想,標頭檔案出現的原因:

需要使用的符號都要在被使用之前宣告,如果沒有標頭檔案你就需要在同乙個.cpp檔案中寫許多的東西,還要顧及先後次序(其實標頭檔案在編譯時會在包含它的檔案中開啟,亦即是說,標頭檔案實際上是.cpp檔案的一部分,這也是需要預編譯標頭檔案技術的原因,編譯器是以檔案為單位編譯的),所以,標頭檔案是追求簡潔美觀方便的結果(有什麼不是由這個目的產生的呢?)

標頭檔案要注意的一些問題:首先,注意標頭檔案的重複包含會出現問題(容易發現),其次,不要再說乙個.h檔案對應乙個.cpp檔案這種傻話(我以前也是這麼想的),你大可以在標頭檔案中宣告且只是宣告(宣告和定義是不同的概念)乙個函式fun,而在某.cpp檔案中包含其標頭檔案,並且使用函式fun,在編譯時是不會出現錯誤的,但在鏈結的時候就會出現link 2001錯誤(不出現才奇怪呢,這本該是在另乙個.obj檔案中的,現在那個.obj根本不存在.).

還有,看一下這個#include,毫無疑問這個標頭檔案編譯器會自己加進來,但這個標頭檔案內的符號在**定義(這裡就要用定義這個詞了)了呢?答案,我也不知道.但並非毫無頭緒,我們需要的東西在一些標準庫里(注意,我沒有用乙個,而用了一些),而這些庫,對,也是編譯器自己鏈結進來的(kernel32.lib之類的導入庫我們是可以看見的,但這些靜態庫我們真的看不見),所以總有那麼一天你會用上這個命令:#pragma comment(lib, "****.lib"),什麼意思自己猜(或者在工程設定裡面自己加).

那現在知道為什麼不能說乙個.h對應乙個.cpp(也包括.c啦)了嗎?為人為到底:

c/c++的這些東西:.obj  .lib  .dll都是由.c或.cpp產生的,這些檔案裡面大多是函式的定義(實現),而對應函式的宣告在某些.h(標頭檔案也用於定義一些符號之類的)裡,而乙個標頭檔案的符號的定義也可以是在多個庫裡面(記住標頭檔案只是用來告訴編譯器有這個東西和這個東西怎麼用).不用擔心呼叫時會出現問題,只要你的符號有正確的定義,那麼就能正確生成.exe檔案(或者.dll,忽略具體細節啦,修復匯入段之類的我也不是很清楚,簡單想像就是編譯器把一它不認識(但知道有)的符號交給鏈結器:你去找到這些東西,把這些東西按順序放好,我生成的**要用到call之類的命令(哥學過一點彙編,大概吧....))

歡迎指正.

2009-12-15

一些 h標頭檔案的小總結

h檔案作用 1 方便開發 包含一些檔案需要的共同的常量,結構,型別定義,函式,變數申明,2 提供介面 對乙個軟體包來說可以提供乙個給外界的介面 例如 stdio.h h檔案裡應該有什麼 常量,結構,型別定義,函式,變數申明 h檔案不應該有什麼 變數定義,函式定義 extern問題 對於變數需要ext...

關於stringstream的一些總結

c 標準庫中的提供了比ansi c的更高階的一些功能,即單純性 型別安全和可擴充套件性。可以使用這些庫來實現安全和自動的型別轉換。如果你已習慣了風格的轉換,也許你首先會問 為什麼要花額外的精力來學習基於的型別轉換呢?也許對下面乙個簡單的例子的回顧能夠說服你。假設你想用sprintf 函式將乙個變數從...

關於JSON的一些總結

一 關於json json是一種類似於xml的通用資料交換格式,具有比xml更高的傳輸效率.從結構上看,所有的資料 data 最終都可以分解成三種型別 第一種型別是標量 scalar 也就是乙個單獨的字串 string 或數字 numbers 比如 北京 這個單獨的詞。第二種型別是序列 sequen...