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

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