Probleme mit typedef enum
-
Hallo,
ich habe folgende typedef's
typedef enum{OK,TIME_OUT_HEADER,TIME_OUT_DATA,CKS_HEADER,CKS_DATA}COMSTATUS;
typedef enum{OK,TIME_OUT,CKS}STATUS;Der Compiler mekert nun das OK mehrfach declariert ist.
Warum, ich habe doch zwei unterschiedliche Datentypen in denene die
Daten gekapselt sind.
-
wenn du dir die Hilfe zu enum und Aufzählungen angesehn hättest, wär die bestimmt aufgefallen, dass dort folgendes steht:
BCB-Hilfe schrieb:
enum [<tag_name>] {<konstantenname> [= <wert>], ...} [variablen_liste];
...
Die Tag-Namen von Aufzählungstypen teilen sich den Namensbereich mit Struktur und Varianten. Die aufgezählten Konstanten teilen sich den Namensbereich mit normalen Variablen:
int mo = 11;
{
enum tage { so, mo, di, mi, do, fr, sa } alletage;
/* Die Aufzählungskonstante mo verdeckt die vorherige Deklaration von int mo */
struct tage { int i, j;}; // UNGÜLTIG: tage ist doppelter Tag
double sa; // UNGÜLTIG: Neudefinition von sa
}mo = 12; // zurück im Gültigkeitsbereich von int mo
In C++ gelten Aufzählungskonstanten, die in einer Klasse definiert wurden, nur im Gültigkeitsbereich dieser Klasse.
und übersetzt: du hast 2 Variablen mit gleichem Namen erstellt, das gilt auch für die innerhalb der Klammern
-
Pack deine enums doch einfach in namspaces (oder structs). Dann bist du das Problem los.
-
Linnea schrieb:
wenn du dir die Hilfe zu enum und Aufzählungen angesehn hättest, wär die bestimmt aufgefallen, dass dort folgendes steht:
BCB-Hilfe schrieb:
enum [<tag_name>] {<konstantenname> [= <wert>], ...} [variablen_liste];
...
Die Tag-Namen von Aufzählungstypen teilen sich den Namensbereich mit Struktur und Varianten. Die aufgezählten Konstanten teilen sich den Namensbereich mit normalen Variablen:
int mo = 11;
{
enum tage { so, mo, di, mi, do, fr, sa } alletage;
/* Die Aufzählungskonstante mo verdeckt die vorherige Deklaration von int mo */
struct tage { int i, j;}; // UNGÜLTIG: tage ist doppelter Tag
double sa; // UNGÜLTIG: Neudefinition von sa
}mo = 12; // zurück im Gültigkeitsbereich von int mo
In C++ gelten Aufzählungskonstanten, die in einer Klasse definiert wurden, nur im Gültigkeitsbereich dieser Klasse.
und übersetzt: du hast 2 Variablen mit gleichem Namen erstellt, das gilt auch für die innerhalb der Klammern
Danke für die Hilfe, das ganze ist mir nun klar.
Pack deine enums doch einfach in namspaces (oder structs). Dann bist du das Problem los.
Habe ich gemacht, dann funktioniert es.
-
Ist nur etwas lästig, da ich immer den namespace mit angeben muss
A::COMSTATUS...
-
Das geht aber nicht anders. Der Compiler muss deine enums ja unterscheiden können.
Bevor namespaces verwendet wurden, hat man sowas auch mit Prefixes gelöst.
Wenn du immer nur einen enum pro Übersetzungseinheit verwendest, könntest du auch mit using namespace arbeiten. Ich würde das aber lieber nicht machen, da man schnell zu Mehrdeutigkeiten kommt.
Noch was.
Die typedefs vor den enums kannst du weglassen. Das ist bei C++ nicht mehr üblich.