gpt4 book ai didi

c++ - 由于在多个 cpps 中包含相同的 header 而导致重复的多个定义错误

转载 作者:IT老高 更新时间:2023-10-28 22:32:08 25 4
gpt4 key购买 nike

因此,无论我做什么,我似乎都无法避免 Dev C++ 出现大量多重定义错误,因为我在同一个项目的多个源代码文件中包含了相同的头文件。我强烈希望避免将所有源代码转储到一个文件中,并且只包含一次 header ,因为这会使我的文件非常长且难以管理。

基本上是这样的:

#ifndef _myheader_h
#define _myheader_h

typedef struct MYSTRUCT{
int blah;
int blah2; } MYSTRUCT;

MYSTRUCT Job_Grunt;
MYSTRUCT *Grunt = &Job_Grunt;
MYSTRUCT Job_Uruk;
MYSTRUCT *Uruk = &Job_Grunt;

int Other_data[100];

void load_jobs();

#endif

示例 Cpp 文件(它们几乎都像这样):

#include "myheader.h"

void load_jobs(){

Grunt->blah = 1;
Grunt->blah2 = 14;

Uruk->blah = 2;
Uruk->blah2 = 15;

return; }

请记住,我有大约 5 个包含这个头文件的 cpp 文件,每个文件处理头文件中的不同类型的结构。在这个例子中,只有一个结构包含几个成员,而实际头文件中有大约 4-6 个不同的结构和更多的成员。我包含的所有文件都遵循与您在此示例中看到的相同的公式。

现在我了解到, header 保护只会阻止每个单独的 cpp 文件多次包含头文件。似乎正在发生的事情是,当编译器在每个 cpp 的开头读取包含时,它会重新定义头文件,这导致它吐出以下行和行:

Multiple Definition of Uruk, first defined here  
Multiple Definition of Job_Uruk, first defined here
Multiple Definition of Grunt, first defined here
Multiple Definition of Job_Grunt, first defined here
Multiple Definition of Other_data, first defined here

我会为项目中几乎每个包含 header 的 cpp 文件看到一组这样的内容。我尝试将结构和结构变量的定义移动到 cpp 文件中,但是其他 cpp 文件看不到它们或无法使用它们,这非常重要,因为我需要项目中的所有文件才能工作使用这些结构。

但是关于这个问题最令人困惑的部分需要更多解释:

我在这个项目中设置这些多个文件的方式与我正在使用的书相同,即 John S. Harbour 的 All In One Game Programming。当我为书中的示例项目创建文件时遇到了完全相同的问题,这些文件要求同一项目中的多个 cpp 包含一个 header 。

我可以逐字逐句打出书中的内容,而且我的意思是逐字逐句...
我会得到项目中每个 cpp 的一系列 MD 错误。

如果我从本书随附的 CD 中加载示例项目,它会毫无问题地编译和运行,尽管文件本身以及项目选项在所有外观上都与我创建的相同。

如果我创建自己的项目文件,并简单地从 CD 中添加示例项目的源文件和头文件,这也将编译和运行,尽管我发现它们和我的没有区别。

然后,我尝试制作自己的项目文件,然后创建空白源文件和头文件并将它们添加到其中,然后通过从 CD 上的文件中复制和粘贴它们的内容来填充它们(相同的工作)。果然,我会得到同样的东西……一行又一行的 MD 错误消息。

我完全感到困惑。我已经多次重复所有这些方法,并且确定我没有输入错误或错误复制代码。预制文件本身似乎有些东西。一些配置设置或其他我完全丢失的东西......这将导致它们正确编译而我自己制作的文件不会。

最佳答案

由于您在头文件中声明这些变量,并且在每个 C++ 文件中包含头文件,因此每个 C++ 文件都有自己的拷贝。

解决这个问题的常用方法是在头文件中声明任何变量。相反,在单个 C++ 文件中声明它们,并在您可能需要它们的所有其他文件中将它们声明为 extern

我之前处理过的另一种方式,有些人可能会认为这很不愉快...在头文件中声明它们,如下所示:

#ifdef MAINFILE
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN MYSTRUCT Job_Grunt;
EXTERN MYSTRUCT *Grunt = &Job_Grunt;
EXTERN MYSTRUCT Job_Uruk;
EXTERN MYSTRUCT *Uruk = &Job_Uruk;

然后,在您的 一个 C++ 文件中,添加...

#define MAINFILE

...在您的 #include 行之前。这将处理所有事情,并且(在我个人看来)比必须重新声明每个文件中的所有变量要好得多。

当然,真正的解决方案是根本不使用全局变量,但是当你刚开始时,这很难实现。

关于c++ - 由于在多个 cpps 中包含相同的 header 而导致重复的多个定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/223771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com