2013-03-04 106 views
10

據我所知,當你有多個文件包括同一個文件時,這個錯誤是由於沒有正確地使用頭文件引起的。在我而言,這是包括樹是造成錯誤:函數已經在.obj中定義了

File A includes Z, which contains the functions I need. File B includes A, and file C includes A.

沒有任何#pragma once的,程序給出了一堆同樣的錯誤的變化:

blahblah.obj: error LNK2005: class some::namespace::ObjectType Object already 
    defined in dialogDlg.obj 

我只是想知道,鑑於我描述的包含樹,有什麼正確的方法來正確編譯?

我嘗試在文件Z上使用#pragma once,但那不起作用。我也在文件A上嘗試過#pragma一次,這也沒有奏效。最後我在A和Z上都試過了,也沒有奏效。

+0

東西給我你不使用單獨的頭文件的想法? – 2013-03-04 14:40:35

回答

12

看來你試圖定義一個頭文件中的變量。如果該頭文件包含在多個源文件中,它將在每個源文件中定義,從而給你錯誤。

而是聲明它作爲extern然後在其中一個源文件中定義。

所以在頭文件:

extern ObjectType Object; 

而且在源文件:

ObjectType Object; 
+2

我只想補充一點,這與包含衛兵無關。包含警衛有助於防止在同一個源文件中多次包含相同的頭文件*我們正在查看通過包含在*不同*源文件中的頭文件來創建問題。 – Angew 2013-03-04 14:35:10

+0

好的,如果我需要訪問文件B和文件C(都是.cpp文件)中的這些變量和對象,有沒有辦法實現這個乾淨? – xcdemon05 2013-03-04 14:36:06

+1

只要你一起編譯b.cpp和c.cpp,這個解決方案已經達到你想要的。 – us2012 2013-03-04 14:39:56

相關問題