Verständnisfrage - "extern"

Gast #5857648
Lesenswert?

Hallo Forum,

ich hätte mal eine Frage zur richtigen Verwendung von "extern".

Mein Szenario:

Ich habe eine main.c, in der ich ein Menü implementiert habe.
Desweiteren habe ich eine display.h / display.c, in der die 
Initialisierung eines GLCD stattfindet sowie diverse zusätzliche 
Display-Funktion implementiert sind.

Sowohl main.c als auch display.c benötigen Zugriff auf eine Referenz zu 
einer u8g2 (Grafik-LCD Library) Instanz.

Mein Code (minimiert):
1
display.h
2

3
#include "u8g2/u8g2.h"
4

5
extern u8g2_t u8g2;
6

7
void initDisplay();


1
display.c
2

3
#include "display.h"
4

5
void initDisplay() {
6
  u8g2_Setup_ssd1309_128x64_noname0_f(&u8g2, U8G2_R2, u8x8_byte_4wire_sw_spi, u8x8_avr_gpio_and_delay);
7
  ...
8
}


1
main.c
2

3
#include "display.h"
4

5
u8g2_t u8g2;
6

7
void main() {
8
  initDisplay();
9
}

Kann mir jemand sagen, ob die Verwendung von 'extern' so korrekt ist?
Das Programm wird fehlerfrei kompiliert, allerdings wird es das auch, 
wenn ich 'extern' in der main.c verwende anstatt in der display.h.

Wie herum ist es richtig?

Vielen Dank für eure Hilfe.

Mario
Persönliche Seite #5857660
Lesenswert?

Mezzo schrieb:
> Kann mir jemand sagen, ob die Verwendung von 'extern' so korrekt ist?

Ja.

Mezzo schrieb:
> Wie herum ist es richtig?

In diesem Fall funktionieren zwar beide, aber die erste Version ist 
sinnvoller. Wenn das "extern" in der main ist, und du die "display.h" 
irgendwann später von einer anderen Datei inkludierst, hast du eine 
doppelte Definition und bekommst Linker-Fehler.

Die Regel ist eigentlich ganz einfach:
Variablen die global überall sichtbar sein sollen einmal in einer 
Header-Datei mit "extern" deklarieren, und in genau einer .c-Datei 
einmal ohne "extern" definieren.

Globale Variablen sind aber allgemein nicht sehr sauber und können den 
Code schwer wartbar machen. Indem du "u8g2" als Parameter mit an 
"initDisplay" übergibst vermeidest du das komplett. Somit könntest du 
später auch relativ simpel mehrere Displays ansprechen.

Warum kommen zu "extern" eigentlich letztens so viele Fragen... So 
schwierig ist das ja auch nicht...
Gast #5857711
Lesenswert?

Hallo Niklas,

vielen Dank für Deine ausführliche Erklärung.
Ich werde den Code umbauen und die Referenz auf das Display beim Aufruf 
der Funktionen durchreichen. Das erscheint mir auch übersichtlicher, da 
man ja sonst auf den ersten Blick überhaupt nicht sieht, wo die Variable 
u8g2 noch verwendet wird...

Trotzdem gut zu wissen, wie man 'extern' hier richtig anwenden würde.

1000 Dank!

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