Forum: Compiler & IDEs enum Definitionm


von Mach F. (machfax)


Lesenswert?

Hallo zusammen

Mal eine ganz blöde Frage für C-Programmierung.

Ich habe 2 enum definiert:
1
enum UnitReply
2
    {
3
        ParameterInvalid          = 0x02,
4
        ParameterOutOfRange          = 0x03,
5
        ParameterUnknown          = 0x04,
6
        CommandOk                  = 0x40,
7
        CommandInvalid            = 0x41,
8
        CommandFinished            = 0x42,
9
        StatePowerUp            = 0x80,
10
        StateReady                  = 0x81,
11
        StateBusy                  = 0x82,
12
        StateEmergencyStop          = 0x83
13
    } ;
14
15
enum ModuleReply
16
    {
17
        ParameterInvalid          = 0x02,
18
        ParameterOutOfRange          = 0x03,
19
        ParameterUnknown          = 0x04,
20
        CommandOk                  = 0x10,
21
        CommandInvalid            = 0x11,
22
        CommandFinished            = 0x12,
23
        State                    = 0x60,
24
        FlashWriteCounter          = 0x70
25
    };
Je ich möchte jetzt im einen Fall den Wert für "CommandFinished" von 
ModuleReply und einamal den Wert für UnitReply nehmen.

Wenn ich den enum aber so im header definiere, sagt mir der Compiler 
dass CommandFinished schon einmal definiert wurde, ich möchte aber den 
Wert aus dem entsprechenden enum nehmen, und die enum im gleichen header 
File definieren da ich im c file beide enum benötige.

Kann mir da bitte jemand auf die Sprünge helfen?

Danke

: Verschoben durch User
von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

In C sind leider die in den enums definierten Werte global und müssen 
daher eindeutig sein. Außerdem macht der Compiler auch keine ordentliche 
Überprüfung, ob die Werte überhaupt zu dem jeweligen enum gehören. Die 
Werte sind einfache Interger-Konstanten. Das sind ganz gewaltige 
Schwächen von C.

In C++ kann man mit Namespaces arbeiten und somit ggf. sogar jedem enum 
einen eigenen verpassen. Dann könnte man z.B. explizit auf 
UnitReply::CommandFinished zugreifen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Auf einen ganz einfachen Nenner gebracht:

In C sind enums die Energie nicht wert, die das Tippen des 
Schlüsselwortes benötigt. Die C 'Implementierung' von enum ist mehr oder 
weniger nutzlos. enums sind in C nicht viel mehr als eine Sammlung von 
Text-Flags, die Werte repräsentieren. Mehr nicht. Gegenüber einer 
Sammlung von #defines gewinnst du eigentlich nur, dass du in 
Funktionsköpfen
1
enum UnitReply foo( enum ColorValue background );
einen gewissen dokumentarischen Hinweis gibst, welche Werte erwartet 
werden bzw. womit man als Programmierer rechnen muss. Aber: das wird von 
nichts und niemandem eingefordert. In C sind enums keine eigenständigen 
Typen und werden hemmungslos von und nach int konvertiert, wie es gerade 
passt. Du kannst auch zb an den Paramater background, der ja eigentlich 
ein enum ColorValue ist, einen Wert aus dem enum UnitReply übergeben. Da 
stört sich nichts und niemand daran.

enum sind in C ernsthaft fehlerhaft. Ausser einer glorifizierten Liste 
von Integern, denen man einen Namen geben kann und die man unter einem 
Stichwort zusammenfasst, und die im Debugger auftauchen, bleibt nicht 
viel übrig.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Hier hab ich eine ganz brauchbare Diskussion gefunden, was an C enums 
nicht stimmt
http://gnuvince.wordpress.com/2009/09/08/enums-in-c/

von foo (Gast)


Lesenswert?

Karl Heinz schrieb:
> Du kannst auch zb an den Paramater background, der ja eigentlich
> ein enum ColorValue ist, einen Wert aus dem enum UnitReply übergeben. Da
> stört sich nichts und niemand daran.

Naja, sicher kannst, aber der Compiler sollte ein Warning generieren.
"enumerated type mixed with another type"

Also ganz nutzlos sind enums nicht.

von Mach F. (machfax)


Lesenswert?

Hallo

Ok, und das heisst wie löst man dies jetzt richtig?
Ich habe keine Lust im Code Hex-Werte zu ändern und über defines geht es 
ja, aber ist da nicht eine bessere Lösung vorhanden?
Mit einem struct oder geht das wirklich nur über defines?

Danke

: Bearbeitet durch User
von foo (Gast)


Lesenswert?

Mach Fax schrieb:
> Mit einem struct oder geht das wirklich nur über defines?

Was willst Du machen?

Meine enums bekommen ein prefix.
1
enum MODNAME_foo
2
{
3
   MODNAME_BLA,
4
   MODNAME_SEPP,
5
   MODNAME_KOARL,
6
   MODNAME_INGE
7
};

von Mach F. (machfax)


Lesenswert?

foo schrieb:
> Was willst Du machen?

enum UnitReply
    {
    CommandFinished            = 0x42,
    } ;

enum ModuleReply
    {
    CommandFinished            = 0x12,
    };

CommandFinished mit 2 Werten je nachdem welchen enum ich wähle 
verwenden.
Aber demzufolge geht das nur mit zum Bsp:
Dann kann ich auch direkt #define verwenden und den enum kicken...

enum UnitReply
    {
    UnitCommandFinished            = 0x42,
    } ;

enum ModuleReply
    {
    ModuleCommandFinished            = 0x12,
    };

Korrekt? Ist C wirklich nicht zu mehr fähig? Oder bin ich zu blöd?

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Mach Fax schrieb:

> CommandFinished mit 2 Werten je nachdem welchen enum ich wähle
> verwenden.

Und die Antwort ist immer noch dieselbe: Das geht in C nicht.

Nicht umsonst wird C++ manchmal auch als 'das bessere C' bezeichnet. Da 
wurden zb. derartige Dinge 'gefixt'.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mach Fax schrieb:
> Dann kann ich auch direkt #define verwenden und den enum kicken...

Yep, das kannst du.  Der wesentliche Unterschied ist, dass die
enum-Werte vom Debugger angezeigt werden können.

von Mach F. (machfax)


Lesenswert?

Jörg Wunsch schrieb:
> Yep, das kannst du.  Der wesentliche Unterschied ist, dass die
> enum-Werte vom Debugger angezeigt werden können.

Ok Danke @ all für die Antworten!!!

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.