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