關於 h cpp和inline的討論

2021-09-22 04:58:37 字數 2395 閱讀 3439

很多書講得不是很詳細的。 

簡單說:

.h裡面是宣告,編譯器不會為其建立實體,僅僅是告知所有模組,這個世界上有這麼個東東,函式,定義什麼的,你們要用,可以,編譯器會幫你連線到實體。 

.cpp裡面就是例項了,編譯器會產生真實的**段,全域性變數也會分配具體的單元(如果能分配的話)

如果在.**件中強行定義實體,連線的時候,會報告錯誤,說有個命名擁有多個實體。 

比如你定義char* szdata="aaa"; 

這個如果寫到.**件裡面,則每個引用該.h的cpp產生的obj裡面都有乙個szd 

ata的實體,則link程式就暈菜了,不知道哪個算,就報錯。 

因此,如果要定義這種具體需要分配單元的字串變數,需要在.cpp裡面定義,然後在.h中宣告:char* szdata;,看見沒,這沒有分配單元,只是提醒大家,符號表中有這個szdata,大家可以用。 

可見,同樣的char*szdata,寫在.h裡面是宣告,而寫在.cpp裡面,是定義。大家別弄混了。

反過來,.h裡面宣告了,所有的.cpp裡面沒有定義,則大家不用這個命名也就罷了,如果一用,link又暈菜了,找不到這個命名具體對應哪個位址單元,也會報錯。

簡單說 

對於變數,.h中可以宣告,但是不要有賦初值動作,賦值放到.cpp裡面去,就都ok了。 

對於函式,大家其實都知道.h裡面宣告,在.cpp裡面定義,就好了,不過,按照c的習慣,在.h裡面的宣告前面最好加上extern修飾,這樣,即使以後你的函式放在哪個lib或者dll、so裡面,也是可以被正確link的。

這裡又說一下inline。 

c和c++的實現,我的理解其實是不一樣的。 

c裡面,要求顯式宣告inline,而c++中,直接寫到.**件中,類的宣告中就好了。 

不過,從編譯器角度理解,二者差不多。 

在編譯階段,就是cc階段,內聯函式都是產生**,但是這些**是虛**,本身不會被顯式定義位址段,也不會正式進入符號表被呼叫,而是類似巨集一樣,被直接展開到每個呼叫的地方。 

因此到了link階段,是根本看不到這些函式的,符號表中沒有,就好像沒有它一樣,它已經在前一階段被自動展開,作為每個呼叫函式的一部分,編譯成原始**了。 

而普通的函式,link的過程,基本上就是查符號表,安排基棧位址什麼的,然後在呼叫處寫上乙個call。 

這種先展開和後定址的差異,應該是inline函式和普通函式最大的差異性了。 

嗯,還有一種方法我比較喜歡用。 

不管是inline函式還是普通函式,還是什麼變數。 

我在某個cpp裡面實現了,但是不在.h裡面宣告。 

我一直等待用它的時候,在用的函式的cpp實現前面臨時宣告。這麼做的好處是減少內部定義暴露在外的可能性,減少耦合性。

比如我在a.cpp裡面定義了函式func1和char* szdata。 

void func1(void) 

char* szdata="aaa";

但是我不在a.h裡面宣告。

b.cpp裡面,有個函式func2要用的時候,我再來宣告

void func1(void); 

char* szdata;  //看見沒,臨時宣告 

void func2(void) 

反正誰用誰宣告,不用的別看,這樣寫,程式bug少很多的。

嗯,如果是inline函式,由於函式實體就是宣告,因此,這種用法的話,需要把inline函式全部拷貝一遍過來,而不能簡單寫個宣告了事。

不過,拷貝應該不難吧?呵呵

總的來說,寫.**件有時候要慎重一點,懶一點,能不宣告就不宣告,因為以後用的人,可能會亂想亂用,造成不必要的bug。

這也說明,其實c和c++一樣,都可以做到模組化的內聚程式設計的,c++呢,通過private,強行拒絕外部的無關使用,告訴使用者,許看不許摸。c呢,通過嚴格控制宣告,連看都不准看,呵呵,都是為了保護程式安全。 

內聯函式,很多編譯器會刻意忽視inline這個宣告,如果程式需要用inline優化,需要手動開啟,這個要查一下具體的語言編譯器的說明。 

gcc下的說明請參考這裡 

和這裡 

vc基本上是無視inline宣告的,它把inline作為自己的手段來控制,比如選擇尺寸最大,速度最快時,inline就有效,選擇尺寸最小,inline就無效了。可以看看這裡。 

inline的使用,應該是優化到了極致時採用的一種方法,其提公升效能的能力比較有限,很多時候,遠遠不及乙個演算法優化來得明顯,其實如果不是做高效能程式的話,就沒有必要考慮了。

嗯,vc我一般用來做驗證,高效能優化主要是針對gcc的,所以對inline在vc下的表現一般不太關心。這是因為windows本身就是個很重的作業系統,沒有什麼實時性,也不太適合做高效能應用。如果真的乙個應用已經到了需要用inline做優化的地步,一般首選平台都是linux了,小機器一般就選vxworks了。 

呵呵,一家之言,歡迎拍磚哈。

本文** 

tonyxiaohome

關於 h cpp和inline的討論

很多書講得不是很詳細的。簡單說 h裡面是宣告,編譯器不會為其建立實體,僅僅是告知所有模組,這個世界上有這麼個東東,函式,定義什麼的,你們要用,可以,編譯器會幫你連線到實體。cpp裡面就是例項了,編譯器會產生真實的 段,全域性變數也會分配具體的單元 如果能分配的話 如果在.h檔案中強行定義實體,連線的...

關於inline的用法

內聯函式 1.定義 2.內聯函式與其他函式的區別 3.使用規則 4.使用範圍 5.內聯函式與巨集的區別 6.內聯函式的優缺點 1.定義 以inline 修飾的函式叫做內聯函式,編譯時c 編譯器會在呼叫內聯函式的地方展開。它的優點是沒有函式壓棧的開銷,內聯函式提公升程式執行的效率。2.內聯函式與其他函...

關於inline的小知識

1.要想實現inline函式必須將inline放在函式定義前,而不是函式宣告前 2.protected和public裡的inline函式如果將定義放在了cpp檔案中那麼如果在其他原始檔中使用此函式將會編譯錯誤 3.最好將inline函式定義放在標頭檔案中,某些inline private函式可以忽略...