前不久在寫代碼的時(shí)候遇到一個(gè)link錯(cuò)誤,,代碼的原型如下所示,,基本就是定義了一個(gè)基類和派生類,在派生類的一個(gè)成員函數(shù)中用到了基類定義的一個(gè)內(nèi)聯(lián)函數(shù),。
寫這個(gè)內(nèi)聯(lián)函數(shù)的時(shí)候也沒細(xì)想,,結(jié)果違反了inline函數(shù)的要求。所謂內(nèi)聯(lián)函數(shù),,就是編譯器將函數(shù)定義({...}之間的內(nèi)容)在函數(shù)調(diào)用處展開,,藉此來免去函數(shù)調(diào)用的開銷。如果這個(gè)函數(shù)定義在頭文件中,,所有include該頭文件的編譯單元都可以正確找到函數(shù)定義,。然而,如果內(nèi)聯(lián)函數(shù)fun()定義在某個(gè)編譯單元A中,,那么其他編譯單元中調(diào)用fun()的地方將無法解析該符號,,因?yàn)樵诰幾g單元A生成目標(biāo)文件A.obj后,內(nèi)聯(lián)函數(shù)fun()已經(jīng)被替換掉,,A.obj中不再有fun這個(gè)符號,,鏈接器自然無法解析。 所以,,如果一個(gè)inline函數(shù)會在多個(gè)源文件中被用到,,那么必須把它定義在頭文件中。在C++中,,這意味著如果inline函數(shù)具有public或者protected訪問屬性,,你就應(yīng)該這么做。 |
|