enum Definitionm

#3734554
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
(Firma: Schweigstill IT) Persönliche Seite #3734569
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.
#3734578
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.
Gast #3734655
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.
#3734757
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?

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