Die Bedeutung der c-Aufzählung (typedef enum) [duplicate]

Lesezeit: 8 Minuten

Benutzer-Avatar
Asperger

Ich habe dies kürzlich in einer Antwort gesehen, die für mich gepostet wurde:

typedef enum
{
    NO_OP,
    ADDITION,
} operator_t;

int main()
{
    operator_t operator = NO_OP;
}

Was ist typedef enum und warum sollten wir es verwenden? Ich habe gegoogelt und folgendes gefunden:
http://www.programiz.com/c-programming/c-enumeration

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

Benutzer-Avatar
paulsm4

  1. Es ist definitiv nicht “zu technisch”.

  2. Typdef” und “Aufzählung„Das sind zwei völlig verschiedene Dinge.

  3. 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


Benutzer-Avatar
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.

Bonus: operator_t ist ein enum Datentyp; lesen Sie hier mehr darüber: https://en.wikipedia.org/wiki/Enumerated_type

Benutzer-Avatar
John Bollinger

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:

enum operator
{
  NO_OP,
  ADDITION
};

typedef enum operator operator_t;

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:

 typedef enum operator
 {
    NO_OP,
    ADDITION,
 } operator_t;

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;

Benutzer-Avatar
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.

http://www.cs.utah.edu/~germain/PPS/Topics/C_Language/enumerated_types.html

http://www.cprogramming.com/tutorial/enum.html

http://cplus.about.com/od/introductiontoprogramming/p/enumeration.htm

1345070cookie-checkDie Bedeutung der c-Aufzählung (typedef enum) [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy