前不久在寫**的時候遇到乙個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()
// 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函式必須在標頭檔案中定義嗎?
前不久在寫 的時候遇到乙個link錯誤,的原型如下所示,基本就是定義了乙個基類和派生類,在派生類的乙個成員函式中用到了基類定義的乙個內聯函式。base.h class base base.cpp include base.h inline void base fun derived.h includ...
inline函式定義在標頭檔案中
寫這個內聯函式的時候也沒細想,結果違反了inline函式的要求。所謂內聯函式,就是編譯器將函式定義 之間的內容 在函式呼叫處展開,藉此來免去函式呼叫的開銷。如果這個函式定義在標頭檔案中,所有include該標頭檔案的編譯單元都可以正確找到函式定義。然而,如果內聯函式fun 定義在某個編譯單元a中,那...
inline函式的定義放在標頭檔案中
inline是加在實現上,就算加在宣告上,編譯器也會忽略掉。內聯展開是在編譯時進行的,只有鏈結的時候原始檔之間才有關係。所以內聯要想跨原始檔必須把實現寫在標頭檔案裡。如果乙個 inline 函式會在多個原始檔中被用到,那麼必須把它定義在標頭檔案中。注意 將函式的定義 之間的部分 放在標頭檔案中是強制...