globale Variable in C++

OP #6704599
Lesenswert?
• ▲
▼
Hallo
Ich habe da ein ESP32 Arduino Programm
Ich habe in einem Header
static time_t WatchZeit;
konfiguriert
und lese in der Loop über sntp die Zeit aus und schreibe sie in die 
WatchZeit
Variable
in dem c++ Teil,

  timeinfo = localtime ( &WatchZeit );

 Hour = timeinfo->tm_hour;
 Minute =  timeinfo->tm_min;
 Second = timeinfo->tm_sec;

 printf(">>%d - %d -%d <<", Hour, Minute, Second);

versuche ich die aktuelle Zeit "WatchZeit" auszulesen, aber ist sie dort 
mit 0
initialisiert.

Wo ist mein Denkfehler ?
#6704609
Lesenswert?
• ▲
▼
Wenn eine globale Variable als static deklariert ist, heißt das: sie ist 
nur in dieser "compilation unit" gültig, also nur in dem jeweiligen *.c 
oder *.cpp.

Hast du zwei Quelltexte, die beide eine *.h #includen und in beiden ist 
die Variable als static vereinbart, dann hat dein Programm zwei 
verschiedenen Variablen, eine für jede der beiden Quelldateien.

Damit du nur eine Variable für beide hast, muß sie in einer Datei ohne 
static vereinbart sein, und in allen anderen als extern (und auch ohne 
static).
#6704640
Lesenswert?
• ▲
▼
prog rammierer schrieb:
> Ausserdem tut man Variablen nicht in Header-Dateien deklarieren.
> Nein das tutet man nicht, das ist pöhse!

Doch, DEKLARIEREN (mit extern davor) sehr wohl.
Nur DEFINIEREN (also ohne extern, sodaß Speicher dafür angelegt wird) 
nicht in der .h, sondern in genau einer .c oder .cpp.

>
> Und "static" und globale Variable ist ein Widerspruch in sich!

Hat man sich halt mal vor einem halben Jahrhundert in C so ausgedacht.
Das Schlüsselwort static im Sinne von "mache eine lokale Variable, die 
sonst automatisch wäre, stattdessen statisch" macht ja nur innerhalb von 
Funktionen Sinn. Also war static außerhalb von Funktionen erstmal 
nutzlos, weil globale Variablen sowieso statisch sind (also kein 
Widerspruch, sondern ein Pleonasmus).
Für die Verwendung "global, aber nur in dieser .c sichtbar" hat man dann 
static einfach recycled, anstatt ein neues Schlüsselwort dafür zu 
definieren.

Je weniger Schlüsselworte, um so besser dachten sich die Herren dabei.

Nein, schön ist das nicht - aber es ist nunmal so.
Gast #6704740
Lesenswert?
• ▲
▼
Klaus W. schrieb:
> Für die Verwendung "global, aber nur in dieser .c sichtbar" hat man dann
> static einfach recycled, anstatt ein neues Schlüsselwort dafür zu
> definieren.

Man könnte alternativ (zur Ehrenrettung der Schöpfer) auch postulieren, 
dass mit static (als "stationär" UND "statisch" im Deutschen) die 
Begrenzung auf die umgebende Einheit gemeint ist: Sei es ein 
{}-Klammernpaar oder halt die Übersetzungseinheit.

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.