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

來源:互聯網
上載者:User

前不久在寫代碼的時候遇到一個link錯誤,代碼的原型如下所示,基本就是定義了一個基類和衍生類別,在衍生類別的一個成員函數中用到了基類定義的一個內嵌函式。

// base.hclass Base{protected:   void fun();};// base.cpp#include "base.h"inline void Base::fun(){}// derived.h#include "base.h"class Derived: public Base{public:   void g();};// derived.cppvoid Derived::g(){   fun(); //VC2008: error LNK2019: unresolved external symbol}

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.