因此,无论我做什么,我似乎都无法避免 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 错误消息。
我完全感到困惑。我已经多次重复所有这些方法,并且确定我没有输入错误或错误复制代码。预制文件本身似乎有些东西。一些配置设置或其他我完全丢失的东西......这将导致它们正确编译,而我自己制作的文件不会。