Hallo! Gerne würde ich meine globalen Variablen in die main.h auslagern. Aufbau meiner main.h: #ifndef MAIN_H #define MAIN_H #include ... ... #ifndef GLOBAL_VARIABLES #define GLOBAL_VARIABLES uint8_t CH_eeprom EEMEM; //usw. ... #endif // GLOBAL_VaRS #endif // MAIN_H AVRGCC (Windows): Wenn ich Build mache, schmiert er nach einigen multiple definitons aus der main.h ab. Die Fehler beziehen sich auf alle Object-files, die die main.h einbinden. Alle Fehler beziehen sich auf eeprom.h Wo liegt das Problem? Danke für Hilfe!
Timo P. schrieb: > uint8_t CH_eeprom EEMEM; extern uint8_t CH_eeprom EEMEM; + Variable dann in einer *.c deklarieren.
Ach so: Timo P. schrieb: > #ifndef GLOBAL_VARIABLES > #define GLOBAL_VARIABLES sowas habe ich auch schon probiert (für Konstantendefinition). Das gilt nicht für das gesamte Projekt, sondern nur für das Modul. Hab' ich zumindest so interprtiert, als es nicht funktioniert hat.
Ich schätze, dass meine Idee nicht zulässig ist. Dann muss ich wohl die vars in eine c file packen und in der main dann als ext def. dann läuft es. Aber genau diesen Weg wollte ich mir sparen. - main.h von überall aus einbinden - main.h legt die vars nur einmal an - vars sind dann von überall aus erreichbar - ohne den Umweg über eine separate c-file.
Hallo, wenn Du zwei .c-Dateien hast, die beide den genannten Code aus dem Header einbinden, werden beide .c-Dateien die Variable "CH_eeprom" anlegen und dann sagt der Linker natürlich, daß das nicht geht. Ich meine, Dein Denkfehler liegt hier: Das Verhindern von mehrfach-Inkludieren bezieht sich immer nur auf eine einzelne .c-Datei. Bsp: Die Dateien 1.c und 2.c inkludieren beide main.h. Der Konstrukt #ifndef MAIN_H #define MAIN_H verhindert jetzt, daß beim Übersetzen von 1.c der Code aus main.h mehrfach in 1.c auftreten kann. Das Konstrukt kann aber nicht verhindern, daß 2.c den Code aus main.h ebenfalls einbindet! Grund: Jede .c-Datei wird ja vom Compiler autotark für sich übersetzt. D.h. ein #define, das in 1.c sichtbar ist, ist nicht zwangsläufig auch in 2.c sichtbar. D.h. das #define MAIN_H, das beim Compilieren von 1.c gesetzt wurde, ist nicht mehr gesetzt, wenn 2.c compiliert wird.
Hi, was Du aber durchaus machen kannst:
1 | #ifndef MAIN_H
|
2 | #define MAIN_H
|
3 | |
4 | #include ...
|
5 | ...
|
6 | |
7 | #ifdef GLOBAL_VARIABLES
|
8 | |
9 | uint8_t CH_eeprom EEMEM; |
10 | //usw.
|
11 | #else
|
12 | |
13 | extern uint8_t CH_eeprom EEMEM; |
14 | // usw.
|
15 | |
16 | #endif // GLOBAL_VaRS
|
17 | |
18 | |
19 | #endif // MAIN_H
|
oder (m.E. deutlich geschickter) In allen c-Datei AUßER EINER
1 | #define EX extern
|
2 | |
3 | #include "main.h" |
In main.h
1 | #ifndef MAIN_H
|
2 | #define MAIN_H
|
3 | |
4 | #include ...
|
5 | ...
|
6 | |
7 | #ifdef GLOBAL_VARIABLES
|
8 | |
9 | EX uint8_t CH_eeprom EEMEM; |
10 | //usw.
|
11 | |
12 | #endif // GLOBAL_VaRS
|
13 | |
14 | |
15 | #endif // MAIN_H
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.