函数已经在.obj中定义了

问题描述:

据我所知,当你有多个文件包括同一个文件时,这个错误是由于没有正确地使用头文件引起的。在我而言,这是包括树是造成错误:函数已经在.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

看来你试图定义一个头文件中的变量。如果该头文件包含在多个源文件中,它将在每个源文件中定义,从而给你错误。

而是声明它作为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