Итак, независимо от того, что я делаю, я не могу избежать того, что 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 включать файл заголовка более одного раза. Казалось бы, что происходит, когда компилятор считывает include в начале каждого 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 в проекте, который включает в себя заголовок. Я попытался переместить определения переменных struct и struct в файлы cpp, но затем другие файлы cpp не могут их видеть или работать с ними, что очень важно, так как мне нужны все файлы в проекте, чтобы иметь возможность работать с этими структурами.
Но самая запутанная часть этой проблемы требует немного большего объяснения:
То, как я настраиваю эти несколько файлов в этом проекте, идентично книге, с которой я работаю, «Все в одной игре» Джона С. Харбора. Я столкнулся с точно такими же проблемами, когда создавал файлы для примеров проектов в книге, в которых требовался один заголовок, включаемый несколькими cpps в одном проекте.
Я мог бы напечатать их слово в слово из книги, и я имею в виду слово в слово ...
и я бы получил серию ошибок MD для каждого cpp в проекте.
Если бы я загрузил пример проекта с компакт-диска, входящего в комплект книги, он без проблем скомпилировался бы и запустился, хотя сами файлы, а также параметры проекта, по всей видимости, были идентичны тем, которые я создал.
Если бы я создал свой собственный файл проекта и просто добавил исходный файл и файлы заголовков для примера проекта с компакт-диска, он также скомпилировался бы и запустился, хотя я не могу найти разницы между ними и моим.
Итак, я попытался создать свой собственный файл проекта, затем создать пустые исходные и заголовочные файлы и добавить их в него, а затем заполнить их, скопировав и вставив их содержимое из файлов на компакт-диск, которому они должны были соответствовать (те же, что работали).
И конечно же, я получил бы то же самое ... строки и строки сообщений об ошибках MD.
Я абсолютно сбит с толку. Я повторил все эти методы несколько раз, и я уверен, что я не ошибаюсь и не ошибаюсь в коде. Кажется, что-то есть в самих готовых файлах; какой-то параметр конфигурации или что-то еще, чего я полностью упускаю ... это заставит их правильно компилироваться, в то время как файлы, которые я создаю сам, не будут.