Forum: Mikrocontroller und Digitale Elektronik enum - Fehlermeldung in Atmel Studio


von Veit D. (devil-elec)


Lesenswert?

Hallo,

enum kompiliert nicht fehlerfrei und ich weiß nicht warum?
Das ist doch eine erlaubte Initialisierung inkl. Zuweisung.
1
enum {FAIL, OKAY, TIMEOUT, READY, START}    // Steuerzustände
2
state_Sync = OKAY;
1
Warnung    anonymous type with no linkage used to declare variable '<anonymous enum> state_Sync' with linkage

von Jens (Gast)


Lesenswert?

Du solltest das enum auch benennen.


enum state_Sync {FAIL, OKAY, TIMEOUT, READY, START}    // Steuerzustände

von Veit D. (devil-elec)


Lesenswert?

Hallo,

dein Syntax funktioniert. Vielen Dank.
1
enum state_Sync {FAIL, OKAY, TIMEOUT, READY, START}    // Steuerzustände
2
state_Sync = OKAY;

von Daniel H. (Firma: keine) (commander)


Lesenswert?

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.:
1
enum SyncStates {
2
    FAIL, 
3
    OKAY, 
4
    TIMEOUT, 
5
    READY, 
6
    START
7
} state_Sync = OKAY;

Oder ganz sauber:
1
typedef enum
2
{
3
    FAIL, 
4
    OKAY, 
5
    TIMEOUT, 
6
    READY, 
7
    START
8
} SyncStatesT;
9
10
SyncStatesT state_Sync = OKAY;

von Veit D. (devil-elec)


Lesenswert?

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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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:
1
enum state_Sync {FAIL, OKAY, TIMEOUT, READY, START};    // Steuerzustände
2
3
enum state_Sync state_Sync = OKAY;

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

von Veit D. (devil-elec)


Lesenswert?

Hallo,

also ist es im Grunde egal wie man das nun schreibt, solange der 
Compiler nicht meckert?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

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.