注意:這不是關于如何使用內聯函數或它們如何工作的問題,更多的是為什么要按原樣完成它們。類成員函數的聲明不需要將函數定義為inline,而只是函數的實際實現。例如,在頭文件中:struct foo{ void bar(); // no need to define this as inline}那么,為什么一類功能的內嵌實施有是在頭文件?為什么不能將內聯函數放在.cpp文件中?如果我嘗試將內聯定義放入.cpp文件中,則會出現以下錯誤:error LNK2019: unresolved external symbol "public: void __thiscall foo::bar(void)"(?bar@foo@@QAEXXZ) referenced in function _main 1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe : fatal error LNK1120: 1 unresolved externals
3 回答

手掌心
TA貢獻1942條經驗 獲得超3個贊
有兩種查看方式:
內聯函數在標頭中定義,因為為了內聯函數調用,編譯器必須能夠看到函數主體。為了使天真的編譯器做到這一點,函數主體必須與調用位于同一轉換單元中。(現代的編譯器可以跨翻譯單元進行優化,因此即使函數定義位于單獨的翻譯單元中,也可以內聯函數調用,但是這些優化是昂貴的,并不總是啟用的,并且也不一定總是受支持。編譯器)
必須標記標
inline
頭中定義的函數,因為否則,包含標頭的每個翻譯單元將包含該函數的定義,并且鏈接程序將抱怨多個定義(違反“一個定義規則”)。的inline
關鍵字抑制此,允許多個翻譯單元包含(相同)的定義。
這兩種解釋確實可以歸結為以下事實:inline
關鍵字不能完全滿足您的期望。
C ++編譯器可以隨時隨地應用內聯優化(將函數調用替換為被調用函數的主體,以節省調用開銷),只要它不會改變程序的可觀察行為即可。
該inline
關鍵字使得它更容易讓編譯器應用此優化,通過允許函數定義在多個翻譯單元是可見的,但使用關鍵字并不意味著編譯器已內聯函數,而不是使用關鍵字不禁止編譯器內聯函數。
- 3 回答
- 0 關注
- 498 瀏覽
添加回答
舉報
0/150
提交
取消