enum - Fehlermeldung in Atmel Studio

OP #4746997
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
(Firma: keine) #4747039
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;
OP #4748206
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?
Moderator Persönliche Seite #4748223
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.

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