為什麼類的成員函式在標頭檔案中定義被多次包含沒問題呢

2021-09-27 13:36:49 字數 710 閱讀 6589

先看一段話

「inline 和實際內聯是兩回事

但是 inline 寫出了

或者直接定義在類內部的被當成inline函式 的成員函式

它 不論有幾處定義

------不論標頭檔案包含幾次,或者類被複製在不同實現檔案中幾次-------

都和 被內聯成功一樣 

如果內聯成功,那麼就不會有函式定義的**生成,只會用**塊取代 函式呼叫。

如果內聯失敗,那麼編譯器暗中生成非內聯**,共呼叫者使用,生成對他的函式呼叫

編譯器暗中實現的那份非內聯**,

最終只會有乙份實現,

而不是生成多份,並且都保留下來

--------如果採取生成多份策略,那麼無論生成幾份,最終只保留乙份--------

因為這在編譯器控制能力範圍之內,所以沒問題。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

使用者自己編寫的多份非內聯實現**,

不在編譯器能力之內。

只有報錯,才是本分。

那是因為 如果你在 標頭檔案中定義 即在類內定義成員函式 編譯器預設做inline處理 那 那些小的符合條件的會在不同的包含它的檔案裡變成相應的**段。

而即便有些類內實現的成員函式比較長 也會編譯器偷偷做一下 處理 只保留乙份程式**的。

那些是內聯失敗的

但如果你在標頭檔案 定義了乙個非類成員函式 多次包含的話 就會編譯出問題

C 內聯函式為什麼定義在標頭檔案中?

最近從新撿起c 突然有乙個想法,為什麼內聯函式的會在標頭檔案中申明和定義。如果是c 新手,對申明和定義這兩個詞比較陌生,那麼我先解釋一下申明和定義的意思 原諒我廢話多 為什麼需要內聯函式?函式呼叫包含一系列工作,例如儲存暫存器,並在返回時恢復,可能需要拷貝實參,程式轉向乙個新的位置執行等,這些工作會...

const物件為什麼可以在標頭檔案中定義

對於標頭檔案中為什麼可以定義const變數 或物件 以及推薦用const代替 define巨集定義,之前一直概念不清晰,今天就總結一下。之前在網上查過,解釋的都不太到位,或者角度不一樣 從編譯原理 強弱定義?總之不能清晰理解,發現 c primer 上基本上涵蓋了所有平常遇到的c c 問題,而且 c...

C 中類成員函式做友元函式為什麼報錯?

最近在使用友元函式來訪問私有成員時,遇到了問題,用乙個類成員函式做另乙個類的友元函式,但是一直報錯,提示為定義其中的乙個型別,思考良久 思路 既然友元函式在公有訪問許可權內,就應該可以訪問私有資料成員 在網上搜了很多的部落格,但是都沒有明確的答案,還好最後自己解決了問題,下面寫一下自己解決問題的過程...