Forum: Mikrocontroller und Digitale Elektronik #ifndef #define MAIN_H Prob: multiple definitions EEMEM


von Timo P. (latissimo)


Lesenswert?

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!

von Ralf (Gast)


Lesenswert?

Timo P. schrieb:
> uint8_t CH_eeprom EEMEM;
extern uint8_t CH_eeprom EEMEM;

+ Variable dann in einer *.c deklarieren.

von Ralf (Gast)


Lesenswert?

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.

von Timo P. (latissimo)


Lesenswert?

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.

von DJ T. (Gast)


Lesenswert?

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.

von Michael K. (ampfing)


Lesenswert?

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
Noch kein Account? Hier anmelden.