前不久在寫**的時候遇到乙個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中使用這種形式巨...