globale Variablen in C

Gast #4289708
Lesenswert?
• ▲
▼
Hallo,

einfaches Beispiel:
1
under.c
2
unsigned char hilf = 0;
3

4

5
void func1()
6
{
7
   hilf = 1;
8
}
9

10
under.h
11
extern unsigned char hilf;
12
void func1();
13

14

15
int main() {
16

17
// ...
18
hilf = 1 // dies funktioniert natürlich
19
func1(); // setzt hilf eben nicht gleich 1
20
}

Warum funktioniert func1() in diesem Fall nicht? Ich habe 8 Bit Variable 
hilf doch als globale Variable definiert.

Wie macht man es richtig?
Gast #4290374
Lesenswert?
• ▲
▼
C easy schrieb:
> unsigned char hilf = 0;

Ich hasse sowas. Wer sowas schreibt, verläßt sich ganz und gar auf den 
Startupcode.

Besser ist es, so zu schreiben:
under.h
extern unsigned char hilf;
extern void func1();

under.c

unsigned char hilf;

void main (xyz...)
{ ..
  hilf = 0;

und dann weiter mit dem, was du tun willst.

Merke: es ist IMMER ratsam, Variablen, die man zu benutzen gedenkt, auch 
selbst (mittels einer dedizierten Zuweisung) zu initialisieren - es sei 
denn, daß man es ausdrücklich darauf ablegt, aus dem im Blickfeld dieser 
Quelle uninitialisierten Inhalt der Variablen eine Erkenntnis zu ziehen, 
dei auf Dinge außerhalb der Quelle hinweisen. Beispiel: 
Boolean-Variable in einem Low-Power RTC-Teil des µC, die einem anzeigt, 
ob es zuvor eine Unterschreitung der zulässigen Batteriespannung gegeben 
hat.

W.S.
Gast #4290378
Lesenswert?
• ▲
▼
W.S. schrieb:
> Ich hasse sowas. Wer sowas schreibt, verläßt sich ganz und gar auf den
> Startupcode.

das ist doch Unsinn. C ist definiert Und das gehört die Initialisierung 
von Globalen Variablen dazu.

Warum sollte man extra Speicher für die Zuweisung Verwenden?
#4290384
Lesenswert?
• ▲
▼
W.S. schrieb:

> Ich hasse sowas. Wer sowas schreibt, verläßt sich ganz und gar auf den
> Startupcode.

Das ist der Normalfall.
Wenn man einen Compiler benutzt, bei dem man diese 
Default-Initialisierung abschalten kann, dann sollte man das 
dokumentieren (und selbst die Zuweisungen durchführen). Aber das ist 
dann die Ausnahme. Den Normalfall muss man nicht dokumentieren oder 
dafür Vorsorge treffen.
#4290398
Lesenswert?
• ▲
▼
W.S. schrieb:
> Ich hasse sowas. Wer sowas schreibt, verläßt sich ganz und gar auf den
> Startupcode.

Da dessen Verhalten in dieser Frage völlig klar und eindeutig durch den 
C Standard vorgegeben ist spricht nichts gegen eine Initialisierung im 
Rahmen der Definition globaler oder statischer Variablen.

Eine explizite Initialisierung globaler oder statischer Daten mit 0 kann 
man sich aus dem gleichen Grund sparen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.