Im Moment klingt es etwas zu technisch für mich, also glaube ich nicht, dass ich verstehe, was los ist oder warum jemand das benutzen würde.
Bonus (optional): Um welche Art von Variable handelt es sich? operator_t?
typedef und enum sind getrennte Konzepte. Sie können unabhängig voneinander verwendet werden. Also verstehst du nicht gerade typedefnur enumbeides oder die Verwendung von typedef mit enum?
– Kaylum
16. Dezember 2015 um 22:19 Uhr
Ist das Beispiel mit den Wochentagen nicht selbsterklärend ? Der Trick besteht darin, eine eigene Variable zu definieren.
– Marginal
16. Dezember 2015 um 22:20 Uhr
Wann werden Aufzählungen verwendet?
– Kaylum
16. Dezember 2015 um 22:22 Uhr
Du wirst vielleicht finden static const vs #define vs enum in C nützlich. Es ist keine direkte Antwort auf Ihre Hauptfrage, aber es enthält einige nützliche Hinweise darauf, warum die Verwendung von Vorteil ist enum tippt euren Code ein.
– Jonathan Leffler
16. Dezember 2015 um 23:02 Uhr
Sie sollten Bezeichner vermeiden, die auf enden _t. Dieses Suffix ist vom Standard reserviert und Ihr Code kann in zukünftigen Versionen des Standards möglicherweise nicht kompiliert werden.
– zess
31. Januar 2021 um 20:55 Uhr
paulsm4
Es ist definitiv nicht “zu technisch”.
“Typdef” und “Aufzählung„Das sind zwei völlig verschiedene Dinge.
Der Hauptgrund für “Aufzählungen” besteht darin, “magische Zahlen” zu vermeiden:
Nehmen wir an, Sie haben drei “Zustände”: STOP, ACHTUNG und GO. Wie stellen Sie sie in Ihrem Programm dar?
Eine Möglichkeit besteht darin, die Zeichenfolgenliterale „STOP“, „CAUTION“ und „GO“ zu verwenden. Aber das hat viele Probleme – einschließlich der Tatsache, dass Sie sie nicht in einem C-Block “switch/case” verwenden können.
Eine andere Möglichkeit besteht darin, sie den ganzzahligen Werten „0“, „1“ und „2“ zuzuordnen. Dies hat viele Vorteile. Aber „STOP“ in Ihrem Code zu sehen, ist viel aussagekräftiger als eine „0“. Die Verwendung von “0” in Ihrem Code ist ein Beispiel für ein “magische Zahl“. Magische Zahlen sind schlecht: Sie möchten stattdessen einen “aussagekräftigen Namen” verwenden.
Bevor Aufzählungen in die Sprache eingeführt wurden, verwendeten C-Programmierer Makros:
#define STOP 0
#define CAUTION 1
#define GO 2
Ein besserer, saubererer Ansatz in modernem C/C++ besteht darin, stattdessen eine Aufzählung zu verwenden:
enum traffic_light_states {
STOP,
CAUTION,
GO
};
Die Verwendung eines “typedef” vereinfacht nur die Deklaration einer Variablen dieses Typs:
typedef enum {
STOP,
CAUTION,
GO
} traffic_light_states_t ;
Wow perfekte Erklärung. Wie kommt es, dass es kaum Seiten gibt, die die Dinge für C-Starter so schön und kompakt halten?
– Asperger
16. Dezember 2015 um 23:08 Uhr
Darf ich jetzt fragen, wie c traffic_light_states_t mit der Aufzählung verknüpft? Ich meine, es ist außerhalb der Enum-Klammern
– Asperger
16. Dezember 2015 um 23:09 Uhr
“traffic_light_states_t” ist einfach ein ALIAS. Die beiden Erklärungen, die ich oben gegeben habe, erreichen genau dasselbe. Der einzige Unterschied besteht darin, dass Sie für den ersten eine Variable deklarieren würden enum traffic_light_states my_traffic_light;; vs. traffic_light_states_t my_traffic_light; für die typdefinierte Definition. Weitere Informationen zu “typedef” finden Sie hier: cprogramming.com/tutorial/typedef.html
– paulsm4
17. Dezember 2015 um 1:37 Uhr
Ryan Fitzpatrick
typedef wird verwendet, um einen alternativen Namen für einen vorhandenen Typ zu definieren. Das enum hätte so deklarieren können:
enum operator_t
{
NO_OP,
ADDITION,
};
und dann könnten Sie eine Variable dieses Typs wie folgt deklarieren:
enum operator_t x = NO_OP;
Das ist ziemlich ausführlich, also würdest du es verwenden typedef um einen kürzeren Alias für diesen Typ zu definieren:
typedef enum operator_t operator_t;
Dies definiert operator_t um den Typ zu meinen enum operator_t So können Sie eine Variable wie folgt initialisieren:
operator_t x = NO_OP;
Diese Syntax:
typedef enum
{
NO_OP,
ADDITION,
} operator_t;
führt den gesamten Prozess in einem Schritt aus, definiert also eine (unmarkierte oder taglose) enum type und gibt ihm den Alias operator_t.
Was ist typedef enum und warum sollten wir es verwenden?
Dort laufen zwei verschiedene Dinge ab: ein Typedef und ein Aufzählungstyp (ein “enum”). Ein Typedef ist ein Mechanismus zum Deklarieren eines alternativen Namens für einen Typ. Ein Aufzählungstyp ist ein ganzzahliger Typ mit einem zugeordneten Satz symbolischer Konstanten, die die gültigen Werte dieses Typs darstellen.
Nimmt man zuerst die Aufzählung, besteht die vollständige Form einer Aufzählungsdeklaration aus der enum Schlüsselwort, gefolgt von einem Tag, durch das diese bestimmte Aufzählung identifiziert wird, gefolgt von den symbolischen Aufzählungskonstanten in geschweiften Klammern. Standardmäßig entsprechen die Aufzählungskonstanten aufeinanderfolgenden ganzzahligen Werten, beginnend bei Null. Zum Beispiel:
enum operator {
NO_OP,
ADDITION
};
Wie Sie sehen können, hat es einige Ähnlichkeiten mit a struct Erklärung, und wie a struct Deklaration können Variablen dieses Aufzählungstyps in derselben Anweisung deklariert werden:
enum operator {
NO_OP,
ADDITION
} op1, op2, op3;
oder sie können später deklariert werden, indem auf das Tag der Aufzählung verwiesen wird:
enum operator op4, op5;
Auch wie ein struct Deklaration kann das Tag weggelassen werden, in diesem Fall kann auf den Aufzählungstyp nicht an anderer Stelle im Quellcode verwiesen werden (aber alle deklarierten Variablen dieses Typs sind immer noch in Ordnung):
enum {
NO_OP,
ADDITION
} op1, op2, op3;
Jetzt kommen wir zur Typedef. Wie ich bereits geschrieben habe, ist eine Typedef ein Mittel, um einen alternativen Namen für einen Typ zu deklarieren. Es funktioniert, indem man die typedef Schlüsselwort vor etwas, das sonst eine Variablendeklaration wäre; das Symbol, das der Variablenname gewesen wäre, ist dann der alternative Name für den Typ. Zum Beispiel dieses …
typedef unsigned long long int ull_t;
erklärt ull_t ein alternativer Name für Typ sein unsigned long long int. Die beiden Typnamen können danach (im Rahmen der typedef-Deklaration) austauschbar verwendet werden.
In Ihrem Fall haben Sie
typedef enum
{
NO_OP,
ADDITION,
} operator_t;
was erklärt operator_t als Alias für den angegebenen taglosen Aufzählungstyp. Durch das Deklarieren einer Typedef auf diese Weise wird die Aufzählung über den Typedef-Namen an anderer Stelle verwendbar, obwohl die Aufzählung ohne Tag ist. Dies ist ein ziemlich gebräuchlicher Mechanismus zum Deklarieren eines Kurznamens für einen Aufzählungstyp, und eine analoge Technik ist auch für Strukturen üblich.
Bonus (optional): Welche Art von Variable ist der operator_t?
Wie ich erklärt habe, die operator_t ist keine Variable, sondern ein Typ. Insbesondere ist es ein Aufzählungstyp und die Symbole NO_OP und ADDITION repräsentieren Werte dieses Typs.
Typedefs für Enums, Structs und Unions sind reine Verschwendung. Sie verstecken wichtige Informationen für den fragwürdigen Vorteil, ein paar Zeichen zum Tippen einzusparen.
Verwenden Sie sie nicht in neuem Code.
Technisch gesehen führt eine Typedef eine ein alias, dh ein neuer Name für etwas, das bereits existiert. Das heißt, Typedefs sind nicht neue Typen. Das Typsystem behandelt sie genauso wie den Alias-Typ.
Die Abwähler mögen sich bitte weiterbilden, indem sie zum Beispiel das wunderbare Buch von Peter van der Linden lesen Experte C-Programmierung wo gegen typedefs für enum/struct/union argumentiert wird.
typedef und enum sind zwei unterschiedliche Konzepte. Sie können den Code wie folgt umschreiben:
Die erste Anweisung deklariert eine Enumeration namens operator, mit zwei Werten. Die zweite Anweisung erklärt, dass die Enumeration operator ist jetzt Auch als Typ bekannt sein operator_t.
Die Syntax erlaubt es, diese beiden Anweisungen zu einer Anweisung zu kombinieren:
Und schließlich, um einen Namen für die Aufzählung wegzulassen, da es sowieso einen Datentyp dafür gibt:
typedef enum
{
NO_OP,
ADDITION,
} operator_t;
Jens
Wikipedia hat eine gute Diskussion darüber, was ein Typedef ist
typedef ist ein Schlüsselwort in den Programmiersprachen C und C++. Der Zweck von typedef besteht darin, komplexe Typen aus einfacheren Maschinentypen zu bilden1 und weisen Sie solchen Kombinationen einfachere Namen zu. Sie werden am häufigsten verwendet, wenn eine Standarddefinition oder -deklaration umständlich oder möglicherweise verwirrend ist oder wahrscheinlich von einer Implementierung zur anderen variiert. Siehe diese Seite für eine ausführliche Diskussion von Typedef in Wikipedia
Aufzählungstypen ermöglichen es uns, unsere eigenen symbolischen Namen für eine Liste verwandter Ideen zu erstellen.
Angesichts des Beispiels, das Sie gegeben haben, können Sie enum verwenden, um auszuwählen, welche arithmetische Operation für einen bestimmten Satz von Variablen verwendet werden soll.
Der folgende Beispielcode soll Ihnen eine gute Vorstellung davon vermitteln, wofür enum nützlich ist.
enum ARITHMETIC_OPERATION {ADD, SUBTRACT, MULTIPLY};
int do_arithmetic_operation(int a, int b, enum ARITHMETIC_OPERATION operation){
if(operation == ADD)
return a+b;
if(operation == SUBTRACT)
return a-b;
if(operation == MULTIPLY)
return a*b;
}
Wenn Sie kein Enum hätten, würden Sie stattdessen so etwas tun:
#define ADD 0
#define SUBTRACT 1
#define MULTIPLY 2
int do_artithmetic_operation(int a, int b, int operation);
Diese Alternative ist weniger lesbar, da operation nicht wirklich eine ganze Zahl ist, sondern ein symbolischer Typ, der eine arithmetische Operation darstellt, die entweder ADD, MULTIPLY oder SUBTRACT ist.
Die folgenden Links bieten gute Diskussionen und Beispielcode, der Enum verwendet.
typedef
undenum
sind getrennte Konzepte. Sie können unabhängig voneinander verwendet werden. Also verstehst du nicht geradetypedef
nurenum
beides oder die Verwendung vontypedef
mitenum
?– Kaylum
16. Dezember 2015 um 22:19 Uhr
Ist das Beispiel mit den Wochentagen nicht selbsterklärend ? Der Trick besteht darin, eine eigene Variable zu definieren.
– Marginal
16. Dezember 2015 um 22:20 Uhr
Wann werden Aufzählungen verwendet?
– Kaylum
16. Dezember 2015 um 22:22 Uhr
Du wirst vielleicht finden
static const
vs#define
vsenum
in C nützlich. Es ist keine direkte Antwort auf Ihre Hauptfrage, aber es enthält einige nützliche Hinweise darauf, warum die Verwendung von Vorteil istenum
tippt euren Code ein.– Jonathan Leffler
16. Dezember 2015 um 23:02 Uhr
Sie sollten Bezeichner vermeiden, die auf enden
_t
. Dieses Suffix ist vom Standard reserviert und Ihr Code kann in zukünftigen Versionen des Standards möglicherweise nicht kompiliert werden.– zess
31. Januar 2021 um 20:55 Uhr