Forum: PC-Programmierung globale Variable in C++


von Martin M. (ats3788)


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 ?

von Klaus W. (mfgkw)


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).

: Bearbeitet durch User
von prog rammierer (Gast)


Lesenswert?

Ausserdem tut man Variablen nicht in Header-Dateien deklarieren.
Nein das tutet man nicht, das ist pöhse!

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

von Klaus W. (mfgkw)


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.

von A. S. (Gast)


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.

von Martin M. (ats3788)


Lesenswert?

Danke für die Antworten
Habe es nochmal mit
extern time_t WatchZeit;
deklarieren.
Dann funktioniert es.

Ich hatte gestern mit

  time ( &WatchZeit );
  timeinfo = localtime ( &WatchZeit );

WatchZeit überschrieben und später rausgenommen und das vergessen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.