Reputation: 2604
I defined a special file: config.h
My project also has files:
t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp
and #includes:
in t.c:
#include "t.h"
#include "b.h"
#include "pp.h"
#include "config.h"
in b.c:
#include "b.h"
#include "pp.h"
in pp.c:
#include "pp.h"
#include "config.h"
in l.cpp:
#include "pp.h"
#include "t.h"
#include "config.h"
there are no include directives in my *.h
files, only in *.c
files. I defined this in config.h:
const char *names[i] =
{
"brian", "stefan", "steve"
};
and need that array in l.cpp, t.c, pp.c but Im getting this error:
pp.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
t.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [link] Error 1
I have include guards in every *.h
file I use in my project. Any help solving this?
Upvotes: 81
Views: 199825
Reputation: 122503
Don't define variables in headers. Put declarations in header and definitions in one of the .c files.
In config.h
extern const char *names[];
In some .c file:
const char *names[] = {
"brian", "stefan", "steve" };
If you put a definition of a global variable in a header file, then this definition will go to every .c file that includes this header, and you will get multiple definition error because a varible may be declared multiple times but can be defined only once.
Also, one more thing you can do if you have to define your variables inside of a header file you can use the static
keyword.
static const char *names[] = {
"brian", "stefan", "steve" };
This way variable names
will be defined only once in your entire program and can be accessed multiple number of times.
Upvotes: 167
Reputation: 521
Declarations of public functions go in header files, yes, but definitions are absolutely valid in headers as well! You may declare the definition as static (only 1 copy allowed for the entire program) if you are defining things in a header for utility functions that you don't want to have to define again in each c file. I.E. defining an enum and a static function to translate the enum to a string. Then you won't have to rewrite the enum to string translator for each .c file that includes the header. :)
Upvotes: 52