V C se soubory kompilují po jednom a jen v rámci té jedné kompilace existují definy.
Takže ten "include guard" bude fungovat v takovéto situaci:
== core.h:
struct core {
int foo;
};
== utils.h
#include "core.h"
struct helper {
struct core core;
int bar;
}
== main.c
#include "core.h"
#include "utils.h"
======
Guardem se zabrání dvojitému includu "core" do Main.
Ale ne v této situaci:
== core.h
struct core {
int foo;
};
struct core main_core; // !!!
== utils.c
#include "core.h"
== main.c
#include "core.h"
======
Utils a Main se kompilují nezávisle a v obou bude stejná definice.
Zkrátka, jestli tam máš nějaké definice, tak je vyhoď do .c a v tom .h nech jen deklarace.
== neco.c
int odpoved = 42;
== neco.h
extern int odpoved;