函数已在.obj中定义

xcd*_*n05 10 c++ linker header object include

据我所知,这个错误是由于当你有多个文件包括同一个文件时没有正确使用标题保护引起的.在我的例子中,这是导致错误的包含树:

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
Run Code Online (Sandbox Code Playgroud)

我只是想知道,鉴于我描述的包含树,正确编译它的正确方法是什么?

我尝试使用#pragma once文件Z,但这不起作用.我还在文件A上尝试了#pragma一次,但也没有用.最后我在A和Z上都尝试过,也没用.

Som*_*ude 12

您似乎正在尝试在头文件中定义变量.如果该头文件包含在多个源文件中,则将在每个源文件中定义,从而为您提供错误.

而是将其声明extern然后在您的一个源文件中定义.

所以在头文件中:

extern ObjectType Object;
Run Code Online (Sandbox Code Playgroud)

在源文件中:

ObjectType Object;
Run Code Online (Sandbox Code Playgroud)

  • 我想补充一点,这与包含警卫无关.包括防护有助于防止在一个源文件中多次包含相同的头文件.*我们正在查看通过包含在*不同的*源文件中创建问题的头文件. (2认同)