C C 內聯函式和extern C 問題討論

2021-09-08 00:01:39 字數 1487 閱讀 3772

今天討論下c/c++的幾個覺問題。

內聯(inline)函式

提到內聯函式,先看下面兩個程式,程式的執行結界都是為了得到兩個值相加之和:

//

程式1int add(int x,int y)

int main(int argc,char* ar**)

//程式2

int main(int argc,int ar**)

上面哪個程式的執行效率更高?

答案是「程式2」是c=a+b直接計算得到相加結果,而「程式1」是通過函式呼叫c=add(a,b)得到相加的結果。「程式2」的直接計算,節省了函式呼叫、引數傳值、控制權轉移等開銷,執行效率比「程式1」的函式呼叫要快得多。

然而,實際工作中,可能會更多地採用「程式1」的函式呼叫方式,因為從功能封裝和重複使用上來說,通常會將一段通用的程式片段進行封裝,以便在其他需要相同功能的地方呼叫。這就產生了乙個矛盾,如果將一段特定功能的**封裝成乙個函式,就會大大降低程式效率。

為了解決這個問題,c++引入了內聯函式的概念。內聯函式給出了一種解決方案:如果乙個函式被指定為內聯(inline)函式,則它將在呼叫點上被「內聯」地展開,內聯函式不是在呼叫時發生控制轉移,而是在編譯時將函式體嵌入在呼叫處。

這意味著,編寫**時,可以採用「程式1」的函式呼叫形式,等到編譯時,編譯器會把「程式1」方式編譯成「程式2」的方式,這就是內聯函式的優點所在。唯一要做的就是,在「程式1」中加入關鍵字inline。

//

程式3inline int add(int x,int y) //

宣告為內聯(inline)函式

int main(int argc,char* ar**)

注意:所謂inline函式,只是對c++編譯器的乙個建議。c++編譯器可以選擇忽略這個建議,比如對於大於1200行的函式,或者遞迴呼叫的函式,或者用到遞迴呼叫的函式,通常c++編譯器都不會編譯成內聯函式。

extern "c"

時常在c++的**之中看到這樣的**:

#ifdef _cplusplus 

extern"c

" #endif

這樣的**到底是什麼意思呢?首先,_cplusplus是c++中的自定義巨集,那麼定義了這個巨集則表示這是一段c++的**,也就是說,上面的**的含義是:如果這是一段c++的**,那麼加入extern "c"處理其中的**。

要明白為何使用extern "c",還得從c++中的過載函式入手。在c++中,為了支援過載機制,在編譯生成的彙編碼中,要對函式的名字進行一些處理,加入比如函式的返回型別等等。而在c中,只是簡單的函式名字而已,不會加入其他的資訊。也就是說:c++和c對產生的函式名字的處理是不一樣的。所以,一句話,加入extern "c"是防止名字改編。

c和c++對函式的處理方式是不同的。extern "c"是使c++能夠呼叫c寫的庫檔案的乙個手段,如果要對編譯器提示使用c的方式來處理函式的話,那麼就要使用extern "c"來說明。

c c 內聯函式

理論知識就先上這麼多了,來點實際的,呈上 includeinline double square double x 內聯函式定義 int main using namespace std double a,b a sum 2.0 b square 2.0 3.0 cout a 通過上面的例子可以看出...

C C 內聯函式

內聯 inline 是個修飾符,用來修飾體積不大又呼叫頻繁的函式,可以減小函式呼叫的開銷。所謂減小開銷,就是在編譯時把函式體的 嵌入進去,達到和巨集類似的效果,這樣程式在執行到該函式時,就不需要在頻繁的跳轉中消耗棧的空間。從經驗上來說,函式體在十行以內,執行邏輯極其簡單 寫值,簡單的判斷和計算等 呼...

基礎C C 內聯函式 巨集定義

內聯函式從源 層看,有函式的結構,而在編譯後,卻不具備函式的性質。編譯時,類似巨集替換,使用函式體替換呼叫處的函式名。一般在 中用inline修飾,但是能否形成內聯函式,需要看編譯器對該函式定義的具體處理。如果,內聯函式的函式體過大,一般的編譯器會放棄內聯方式,而採用普通的方式呼叫函式。任何在類的說...