inline函式必須在標頭檔案中定義嗎?

2021-07-02 14:07:16 字數 1043 閱讀 9585

前不久在寫**的時候遇到乙個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 函式會在多個原始檔中被用到,那麼必須把它定義在標頭檔案中。注意 將函式的定義 之間的部分 放在標頭檔案中是強制...