因此,无论我做什么,我似乎都无法避免 Dev C++ 抛出大量多重定义错误,因为我在同一项目的多个源代码文件中包含相同的头文件。我强烈希望避免将所有源代码转储到一个文件中,并且只包含一次标头,因为这将使我的文件非常长且难以管理。
本质上,这是发生的事情:
#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 个不同的结构体,其中包含更多成员。我包含的所有文件都遵循与您在此示例中看到的相同的公式。
现在我明白标头防护只会阻止每个单独的 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
我将在项目中的几乎每个 cpp 文件(包括标头)中看到一组这样的内容。我尝试将结构和结构变量的定义移至 cpp 文件,但其他 cpp 文件无法看到它们或使用它们,这非常重要,因为我需要项目中的所有文件都能够工作与这些结构。
但这个问题最令人困惑的部分需要更多解释:
我在这个项目中设置这些多个文件的方式与我正在使用的 John S. Harbour 的《All In One Game Programming》一书相同。当我为书中的示例项目创建文件时,我遇到了完全相同的问题,该文件要求同一项目中的多个 cpp 包含一个标头。
我可以把它们从书中逐字逐句地打出来,我的意思是逐字逐句......
我会收到项目中每个 cpp 的一系列 MD 错误。
如果我从本书附带的 CD 加载示例项目,它会毫无问题地编译和运行,尽管文件本身以及项目选项从外观上看与我创建的文件完全相同。
如果我创建自己的项目文件,并简单地从 CD 添加示例项目的源文件和头文件,这也将编译并运行,尽管我发现这些文件和我的项目没有任何区别。
然后,我尝试制作自己的项目文件,然后创建空白源文件和头文件并将它们添加到其中,然后通过从它们对应的 CD 上的文件复制并粘贴其内容来填充它们(相同那些曾经有效的)。
果然,我得到了同样的结果……一行又一行的 MD 错误消息。
我完全困惑了。我已经多次重复了所有这些方法,并且确信我没有错误输入或错误复制代码。预制文件本身似乎有一些东西;一些配置设置或其他我完全丢失的东西......这将导致它们正确编译,而我自己制作的文件则不会。