enum - Fehlermeldung in Atmel Studio

OP #4746997
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)
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.