因為多個原始檔包含了含有函式定義的標頭檔案,在編譯的時候,每個原始檔都會包含乙份函式定義,在鏈結時編譯器不知道需要連線哪乙份函式定義。
解決方法有三個:
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)在使用的時候,呼叫add(i, j)即可實現。class math_add
}
以上是三種把函式實現放在標頭檔案中的方法,但是最好還是不要這樣做,還是將函式宣告和實現分開比較好。
參考文章:
inline函式的定義放在標頭檔案中
inline是加在實現上,就算加在宣告上,編譯器也會忽略掉。內聯展開是在編譯時進行的,只有鏈結的時候原始檔之間才有關係。所以內聯要想跨原始檔必須把實現寫在標頭檔案裡。如果乙個 inline 函式會在多個原始檔中被用到,那麼必須把它定義在標頭檔案中。注意 將函式的定義 之間的部分 放在標頭檔案中是強制...
把inline函式的定義放在標頭檔案中
inline是加在實現上,就算加在宣告上,編譯器也會忽略掉。內聯展開是在編譯時進行的,只有鏈結的時候原始檔之間才有關係。所以內聯要想跨原始檔必須把實現寫在標頭檔案裡。如果乙個 inline 函式會在多個原始檔中被用到,那麼必須把它定義在標頭檔案中。注意 將函式的定義 之間的部分 放在標頭檔案中是強制...
模板的宣告和實現為何要放在標頭檔案中?
源 如何組織編寫模板程式 發表日期 1 21 2003 12 28 58 pm 發表人 nemanja trifunovic 前言 常遇到詢問使用模板到底是否容易的問題,我的回答是 模板的使用是容易的,但組織編寫卻不容易 看看我們幾乎每天都能遇到的模板類吧,如stl,atl,wtl,以及boost的...