標頭檔案定義類成員函式出現鏈結錯誤 上

2021-09-29 03:58:26 字數 1176 閱讀 7829

今天乙個同事問我乙個鏈結錯誤的問題,他在.**件實現類成員函式,出現鏈結錯誤,故在此總結此問題產生的原因

先分析以下程式:

#ifndef link_error_h__

#define link_error_h__

#include

class

demo

;void demo::

func()

//實現

#endif

// link_error_h__

#include

"stdafx.h"

#include

"link_error.h"

intmain()

#include

"stdafx.h"

#include

"link_error.h"

因為func()的定義在link_error.**件中,如果在link_error.cpp中,就不會出現上述問題了,具體原因就需要對程式的編譯過程有個清晰的了解:

從原始碼到.exe檔案大概經過了三個階段:

1. 預處理階段:編譯器以.cpp檔案作為乙個單元,處理include,就是尋找該include檔案,並處理該標頭檔案中的巨集替換、變數、函式宣告等,最後將該標頭檔案全部包含進.cpp檔案中

2. 編譯階段:將預處理階段得到的包含.**件的.cpp檔案編譯成二進位製碼,並按照一定的標準生成.obj檔案

回到上面的問題,在鏈結階段發現b.obj中有func()的定義,a.obj中也有func()的定義,並且鏈結的時候,編譯器並不知道該func()是從同乙個.**件中include而來,它不知道該以哪個func()定義為準,所以報錯了。

故請不要在標頭檔案中放定義,否則就會有重複定義的錯誤,但是有幾種情況例外:

1. 內聯函式的定義

2. 類定義

3. const和static變數

4. 模板函式/類

下篇主要對上述幾種情況解釋

參考文章:

注意標頭檔案規則,避免鏈結錯誤:重複定義(multiple defination)

.h和.c檔案的區別到底是什麼(精確講解)

RFs類的GetDir函式出現的問題

程式的 其實很簡單,編寫乙個簡單的活動物件程式,採用rfs的notifychange 函式監控c system install logs下的檔案寫事件,在程式得到檔案伺服器的檔案寫事件通知之後,使用getdir 獲取這個目錄下的所有檔案資訊。就是這樣乙個函式導致系統重起。另外自己也模擬重現這個問題了...

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

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

自定義C trim函式出現的小問題

在位址 中,關於trim函式的方法3 gcc編譯器不能通過問題。這是該 filename stringtrim1.cpp compiler visual c 8.0 description demo how to trim string by other method.release 11 18 2...