Ah, jetzt wird es klarer.
Der C-Präprozessor hat damit nix zu tun. Die Fehlermeldungen stammen vom Linker, der in unterschiedlichen Object-Files gleichnamige Data-Objekte findet.
Der C-Compiler unterscheidet zwischen der Deklaration und der Definition einer Variablen. "Deklaration" heisst, Du sagst Deinem Compiler, dass es irgendwo eine Variable diesen Namens gibt. Deklarationen kannst Du so viele haben wie Du willst. "Definition"dagegen bedeutet, dass der Compiler für diese Variabe auch tatsächlich Speicherplatz bereitstellen soll.
In Deiner Header-Datei stehen
Definitionen, d.h. Du verlangst, dass eine Variable diesen Namens angelegt und Speicherplatz dafür reserviert wird. Jede .c-Datei, die dieses Header-File #includet, bekommt eine ganz eigene Version dieser Variable mit ihrem ganz eigenen Speicherplatz. Da jede .c-Datei eine abgeschlossene Kompilationseinheit ist (d.h. der Compiler weiss nichts von gleichlautenden Variablen in anderen .c-Dateien), geht das solange gut, bis die erzeugten Object-Files gelinkt werden sollen. Dann sieht der Linker eine Variable "main_choices" in action_funcs.o, eine in set_funcs.o usw. Wegen dieses Namenskonfliktes geht das Linken dann in die Hose.
Du musst also im Header-File aus den Definitionen Deklarationen machen: Aus
Code: Select all
static struct part_table
{
char swap[30];
char root[30];
char fs[15];
}hdd_info;
musst Du ein
Code: Select all
extern struct part_table
{
char swap[30];
char root[30];
char fs[15];
}hdd_info;
machen. In irgendeiner passenden .c-Datei gehört dann natürlich noch die Definition der Variablen hinein:
Mache diese Variable aber nicht static! Damit würdest Du die Variable privat für die .c-Datei definieren und die anderen Objectfiles bekämen diese nicht zu sehen und könnten dann ihre Verweise auf die Variable beim Linken nicht aufgelöst bekommen.
Jochen