inline函式注意

2021-07-31 16:26:10 字數 812 閱讀 6568

前不久在寫**的時候遇到乙個link錯誤,**的原型如下所示,基本就是定義了乙個基類和派生類,在派生類的乙個成員函式中用到了基類定義的乙個內聯函式。

[cpp]view plain

copy

print?

// base.h

class

base  

;  // base.cpp

#include "base.h"

inline

void

base::fun()  

{}  

// derived.h

#include "base.h"

class

derived: 

public

base  

;  // derived.cpp

void

derived::g()    

寫這個內聯函式的時候也沒細想,結果違反了inline函式的要求。所謂內聯函式,就是編譯器將函式定義(之間的內容)在函式呼叫處展開,藉此來免去函式呼叫的開銷。如果這個函式定義在標頭檔案中,所有include該標頭檔案的編譯單元都可以正確找到函式定義。然而,如果內聯函式fun()定義在某個編譯單元a中,那麼其他編譯單元中呼叫fun()的地方將無法解析該符號,因為在編譯單元a生成目標檔案a.obj後,內聯函式fun()已經被替換掉,a.obj中不再有fun這個符號,鏈結器自然無法解析。

所以,如果乙個inline函式會在多個原始檔中被用到,那麼必須把它定義在標頭檔案中。在c++中,這意味著如果inline函式具有public或者protected訪問屬性,你就應該這麼做。

inline函式注意事項

1.在類中定義這種函式 class classname 如果在類中直接定義,不需要用inline修飾,編譯器自動化為 內聯函式 此說法在 c primer 中提及 2.在類外定義前加inline 關鍵字 class account 與1相同 double getbalance 在類中宣告 doubl...

inline函式 C 內聯函式 inline

inline要起作用,必須要與函式定義放在一起,而不是函式的宣告 inline 當編譯器處理呼叫內聯函式的語句時,不會將該語句編譯成函式呼叫的指令,而是直接將整個函式體的 插人呼叫語句處,就像整個函式體在呼叫處被重寫了一遍一樣,在執行時是順序執行,而不會進行跳轉。優點 內聯函式沒有執行函式呼叫的開銷...

inline 內聯函式

一 inline關鍵字用來定義乙個類的內聯函式,引入它的主要原因是用它替代c中表示式形式的巨集定義。表示式形式的巨集定義一例 define expressionname var1,var2 var1 var2 var1 var2 為什麼要取代這種形式呢,且聽我道來 1 首先談一下在c中使用這種形式巨...