Veit D. schrieb:> Hallo,>> dein Syntax funktioniert. Vielen Dank.> enum state_Sync {FAIL, OKAY, TIMEOUT, READY, START} // Steuerzustände> state_Sync = OKAY;
Ursprünglich hatte die Enum keinen Identifier und war somit anonym.
Stattdessen hattest du nur eine Variable "state_Sync" deklariert, deren
Typ der anonymen Enum entsprach. Aufgrund des fehlenden
Storage-Classifiers wurde "state_Sync" implizit als "extern" deklariert,
während die Enum aber, da sie anonym ist, nicht extern referenziert
werden kann. D.h. die Variable "state_Sync" wäre zwar extern sichtbar,
ihr Typ aber nicht.
In deiner abgewandelten Version definiert du nun für deine Enum den
Identifikator "state_Sync", und nutzt diesen als Typ für deine Variable,
die ebenfalls "state_Sync" heißt. Die enum ist somit nicht mehr anonym.
Funktioniert so, ist aber unsauber. Sauberer wäre z.B.:
Hallo,
vielen Dank für die Super Erklärung.
Dann mach ich das ganz sauber.
Danke.
Habe mal typedef gegoogelt wofür das genau da ist. Weil das bei enum im
Buch nicht auftaucht. Demnach ist typedef sogar besser geeignet als
define, der Compiler hätte mit typedef mehr Prüfmöglichkeiten. Heißt das
man soll lieber typedef als define verwenden?
Daniel H. schrieb:> Funktioniert so, ist aber unsauber.
Warum sollte das „unsauber“ sein?
In C bilden enums einen eigenen Namensraum, der sich von den
übrigen Namensräumen durch das Voranstellen des Schlüsselworts
"enum" eindeutig unterscheidet. Damit ist es völlig legitim, eine
Variable namens "foo" mit einem Typ "enum foo" zu deklarieren.
Ein typedef ist keineswegs das Nonplusultra („ganz sauber“), auch
wenn er zuweilen die Lesbarkeit natürlich fördern kann – aber das
ist vor allem bei Funktionszeigern der Fall.
Um die Typdeklaration von der Variablendefinition zu trennen,
genügt es, es so zu schreiben:
(Der erste Teil könnte dann beispielsweise auch in ein Headerfile
wandern, falls man den Datentypen über mehrere C-Dateien hinweg bekannt
machen muss.)
NB: In C++ wäre es ein bisschen anders, dort benennt die Deklaration
des enum auch zugleich einen globalen Typen namens "state_Sync", dem
man dann später nicht mehr das "enum" voranstellen muss. Dennoch wäre
obiger Code noch legales C++, da der Namensraum der Variablen von dem
der Datentypen nach wie vor getrennt sind.
Veit D. schrieb:> also ist es im Grunde egal wie man das nun schreibt, solange der> Compiler nicht meckert?
Naja: sinnvoll wäre es schon, wenn du die zugrunde liegenden
Zusammenhänge verstanden hast. Ansonsten ja, es ist egal.