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

2021-10-05 06:45:24 字數 1105 閱讀 1963

最近從新撿起c++,突然有乙個想法,為什麼內聯函式的會在標頭檔案中申明和定義。

如果是c++新手,對申明和定義這兩個詞比較陌生,那麼我先解釋一下申明和定義的意思(原諒我廢話多)

為什麼需要內聯函式?

函式呼叫包含一系列工作,例如儲存暫存器,並在返回時恢復,可能需要拷貝實參,程式轉向乙個新的位置執行等,這些工作會有一定開銷,如果把函式**在呼叫點上內聯地展開,就可以避免這些開銷,加快了程式執行速度,代價是程式體積會隨著內聯的次數增大

一、申明和定義

申明一般放標頭檔案中,定義一般放.cpp檔案中。

比如現在我有個計算絕對值的函式。

首先我建立乙個abs.**件申明這個函式:

int abs(int a);
然後建立乙個abs.ccp檔案定義這個函式:

#include "abs.h"

int abs(int a)else

}int main()

二、內聯函式是什麼?

簡單點來說:內聯函式就是把函式直接用函式體裡面的**替換。
如下,普通函式直接在前面建乙個inline關鍵字就變成了內聯函式。

inline int abs(int a){}
內聯函式就是把函式直接用函式體裡面的**替換這句話意思就是說當我們呼叫abs函式的時候,編譯器可以選擇直接通過替換函式體裡面的**。也就是說直接進行如下操作:

int main()

// 變成

int main()else

return 0;

}

三、內聯函樹為什麼定義在標頭檔案?

內聯函式發生上面那種替換是在編譯期間,在編譯期間編譯器為了找到需要找到內聯函式的定義,所以在為了方便編譯器找到定義,每個檔案引用標頭檔案後,都直接擁有這種定義,而不用再去寫。

而普通函式可以申明和定義分離,主要是編譯階段就不需要函式定義。首先編譯階段找到函式的申明,鏈結階段才會去找函式的定義,將之關聯起來。

[1]

[2]

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

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

inline函式定義在標頭檔案中

寫這個內聯函式的時候也沒細想,結果違反了inline函式的要求。所謂內聯函式,就是編譯器將函式定義 之間的內容 在函式呼叫處展開,藉此來免去函式呼叫的開銷。如果這個函式定義在標頭檔案中,所有include該標頭檔案的編譯單元都可以正確找到函式定義。然而,如果內聯函式fun 定義在某個編譯單元a中,那...

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

先看一段話 inline 和實際內聯是兩回事 但是 inline 寫出了 或者直接定義在類內部的被當成inline函式 的成員函式 它 不論有幾處定義 不論標頭檔案包含幾次,或者類被複製在不同實現檔案中幾次 都和 被內聯成功一樣 如果內聯成功,那麼就不會有函式定義的 生成,只會用 塊取代 函式呼叫。...