So, no matter what I seem to do, I cannot seem to avoid having Dev C++ spew out numerous Multiple Definition errors as a result of me including the same header file in multi
To expand on what Gerald said, the header is defining an instance of the struct (which is not what you want). This is causing each compilation unit (cpp file) which includes the header to get its own version of the struct instance, which causes problems at link time.
As Gerald said, you need to define a reference to the struct (using 'extern') in the header, and have one cpp file in your project which instantiates the instance.
I too was having this problem some time back. Let me try to explain what solved it. I had a global.h file which had all declaration and need to be included in every cpp file. Instead of including it in every .cpp, I included it in .h. All my ".h" files I have added the lines #ifndef and #define and ended with #endif. This solved MD problem. Hope this works for you too.
GCC 3.4 and up supports #pragma once
. Just put #pragma once
at the top of your code instead of using include guards. This may or may not be more successful, but it's worth a shot. And no, this is not (always) precisely equivalent to an include guard.
I also received this error for a function defined in a .h file. The header file was not intended to make declarations of a class but definitions of some functions which are needed in various places in a project. (I may confuse the "definition" and "declaration" usages, but i hope i could give the main idea.) When I put an "inline" keyword just before the definition of the function which give the "multiple definitions" error, the error is avoided.
Since you're declaring those variables in the header file, and including the header file in each C++ file, each C++ file has its own copy of them.
The usual way around this is to not declare any variables within header files. Instead, declare them in a single C++ file, and declare them as extern
in all the other files that you might need them in.
Another way I've handled this before, which some people might consider unpleasant... declare them in the header file, like this:
#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;
Then, in one of your C++ files, add a...
#define MAINFILE
...before your #include
lines. That will take care of everything, and is (in my personal opinion) a lot nicer than having to redeclare all of the variables in every file.
Of course, the real solution is not to use global variables at all, but when you're just starting out that's hard to achieve.
When you define a variable, the compiler sets aside memory for that variable. By defining a variable in the header file, and including that file into all your source files, you are defining the same variable in multiple files.
Putting the keyword extern
before a variable definition will tell the compiler that this variable has already been defined somewhere, and that you are only declaring (i.e. naming) the variable so that other files can use it.
So in your header file you should make all your definitions forward declarations by adding the extern
keyword.
extern MYSTRUCT Job_Grunt;
extern MYSTRUCT *Grunt;
extern MYSTRUCT Job_Uruk;
extern MYSTRUCT *Uruk;
extern int Other_data[100];
And then in one (and only one) of your source files, define the variables normally:
MYSTRUCT Job_Grunt;
MYSTRUCT *Grunt = &Job_Grunt;
MYSTRUCT Job_Uruk;
MYSTRUCT *Uruk = &Job_Grunt;
int Other_data[100];