將函式實現放在標頭檔案中

2021-10-03 01:30:07 字數 781 閱讀 6177

因為多個原始檔包含了含有函式定義的標頭檔案,在編譯的時候,每個原始檔都會包含乙份函式定義,在鏈結時編譯器不知道需要連線哪乙份函式定義。

解決方法有三個:

1.inline關鍵字

可以用關鍵字inline修飾函式定義,例如:

inline int add(int x, int y)

使用inline關鍵字,編譯器會在呼叫此函式的地方把函式的目標**直接插入,像巨集一樣被就地展開了。

另外使用inline關鍵字會有兩個缺點:**的體積變大了;inline不算c語言的關鍵字,以後**移植可能會出現問題。

2.static關鍵字

可以用關鍵字static修飾函式定義,例如:

static int add(int x, int y)

使用static關鍵字,所有包含此標頭檔案的原始檔中都會存在此函式的乙份副本,**也有一定程度的膨脹,但好就好在互相不衝突,因為 static 關鍵字保證了該函式的可見度為單個原始檔之內。

3.通過類的成員函式實現

實現方式如下:

#define add(i,j)  math_add::add(i,j)

class math_add

}

在使用的時候,呼叫add(i, j)即可實現。

以上是三種把函式實現放在標頭檔案中的方法,但是最好還是不要這樣做,還是將函式宣告和實現分開比較好。

參考文章:

inline函式的定義放在標頭檔案中

inline是加在實現上,就算加在宣告上,編譯器也會忽略掉。內聯展開是在編譯時進行的,只有鏈結的時候原始檔之間才有關係。所以內聯要想跨原始檔必須把實現寫在標頭檔案裡。如果乙個 inline 函式會在多個原始檔中被用到,那麼必須把它定義在標頭檔案中。注意 將函式的定義 之間的部分 放在標頭檔案中是強制...

把inline函式的定義放在標頭檔案中

inline是加在實現上,就算加在宣告上,編譯器也會忽略掉。內聯展開是在編譯時進行的,只有鏈結的時候原始檔之間才有關係。所以內聯要想跨原始檔必須把實現寫在標頭檔案裡。如果乙個 inline 函式會在多個原始檔中被用到,那麼必須把它定義在標頭檔案中。注意 將函式的定義 之間的部分 放在標頭檔案中是強制...

模板的宣告和實現為何要放在標頭檔案中?

源 如何組織編寫模板程式 發表日期 1 21 2003 12 28 58 pm 發表人 nemanja trifunovic 前言 常遇到詢問使用模板到底是否容易的問題,我的回答是 模板的使用是容易的,但組織編寫卻不容易 看看我們幾乎每天都能遇到的模板類吧,如stl,atl,wtl,以及boost的...