#ifndef #define MAIN_H Prob: multiple definitions EEMEM

OP #2272076
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!
OP #2272110
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.
Gast #2272202
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.
#2272322
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren