Ich habe seit Jahren kein C ++ mehr geschrieben und jetzt versuche ich, mich wieder darauf einzulassen. Ich bin dann darauf gestoßen und habe darüber nachgedacht aufzugeben:
typedef enum TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
} TokenType;
Was ist das? Warum ist dertypedef
Schlüsselwort verwendet? Warum kommt der Name TokenType
in dieser Erklärung zweimal vor? Wie unterscheidet sich die Semantik davon:
enum TokenType
{
blah1 = 0x00000000,
blah2=0x01000000,
blah3=0x02000000
};
Es ist ein C-Erbe in C, wenn Sie Folgendes tun:
Sie müssen es verwenden, um Folgendes zu tun:
Aber wenn Sie dies tun:
Sie können Folgendes deklarieren:
In C ++ können Sie jedoch nur die vorherige Definition verwenden und sie wie in einem C-Typedef verwenden.
quelle
Sie müssen es nicht tun. In C (nicht C ++) mussten Sie enum Enumname verwenden , um auf ein Datenelement vom Aufzählungstyp zu verweisen. Um es zu vereinfachen, durften Sie es in einen einzelnen Namensdatentyp eingeben .
erlaubte, dass Funktionen, die einen Parameter der Aufzählung nehmen, definiert werden als
statt der längeren
Beachten Sie, dass der Name des Typnamens nicht mit dem Namen der Aufzählung übereinstimmen muss. Das gleiche passiert mit Strukturen.
In C ++ ist dies jedoch nicht erforderlich, da Aufzählungen, Klassen und Strukturen direkt als Typen über ihre Namen aufgerufen werden können.
quelle
In C ist es ein guter Stil, da Sie den Typ in etwas anderes als eine Aufzählung ändern können.
In C ++ können Sie die Aufzählung so definieren, dass sie als C ++ oder C kompiliert wird.
quelle
In C++ you can *typedef* the enum so that it will compile as C++ or C.
? Sie sagten:In C++ you can define the enum so that it will compile as C++ or C.
Beachten Sie, wie ich Ihre geändertdefine
habetypedef
. Nun ... Ich nehmetypedef
ing ist zu definieren.Holdover von C.
quelle
Einige Leute sagen, C habe keine Namespaces, aber das ist technisch nicht korrekt. Es hat drei:
enum
,union
, undstruct
)typedef enum { } XYZ;
deklariert eine anonyme Aufzählung und importiert sie mit dem Namen in den globalen NamespaceXYZ
.typedef enum ABC { } XYZ;
deklariert eineABC
im Tag-Namespace benannte Aufzählung und importiert sie dann als in den globalen NamespaceXYZ
.Einige Leute möchten sich nicht mit den separaten Namespaces beschäftigen, also tippen sie alles ein. Andere tippen nie, weil sie den Namespace wollen.
quelle
Das ist ein bisschen alt, aber ich hoffe, Sie werden den Link, den ich gerade schreibe, zu schätzen wissen, da ich ihn zu Beginn dieses Jahres sehr geschätzt habe.
Hier ist es . Ich sollte die Erklärung zitieren, die mir immer in den Sinn kommt, wenn ich einige böse Typedefs erfassen muss:
Wie bereits erwähnt, müssen in C ++ keine typedefs verwendet werden, die Aufzählungen deklarieren . Aber das ist die Erklärung der Syntax des Typedefs! Ich hoffe, es hilft (wahrscheinlich nicht OP, da es fast 10 Jahre her ist, aber jeder, der Schwierigkeiten hat, solche Dinge zu verstehen).
quelle
In einigen C-Codestyle-Anleitungen wird die typedef-Version aus Gründen der "Klarheit" und "Einfachheit" bevorzugt. Ich bin anderer Meinung, weil das typedef die wahre Natur des deklarierten Objekts verschleiert. Tatsächlich verwende ich keine typedefs, da ich beim Deklarieren einer C-Variablen klarstellen möchte, was das Objekt tatsächlich ist. Diese Wahl hilft mir, mich schneller daran zu erinnern, was ein alter Code tatsächlich tut, und hilft anderen, den Code in Zukunft zu pflegen.
quelle
Die eigentliche Antwort auf die "Warum" -Frage (die von den vorhandenen Antworten über dieser alten Frage überraschenderweise ignoriert wird) lautet, dass sich diese
enum
Deklaration wahrscheinlich in einer Header-Datei befindet, die sowohl als C- als auch als C ++ - Code überkompilierbar sein soll (d. H. sowohl in C- als auch in C ++ - Implementierungsdateien enthalten). Die Kunst, solche Header-Dateien zu schreiben, beruht auf der Fähigkeit des Autors, Sprachmerkmale auszuwählen, die in beiden Sprachen die richtige kompatible Bedeutung haben.quelle