Het belang van C-opsomming (typedef enum)

Ik heb dit onlangs gezien in een antwoord dat voor mij is gepost:

   typedef enum
    {
        NO_OP,
        ADDITION,
    }   operator_t;
int main()
{
    operator_t operator = NO_OP;
}

Wat is typedef enum en waarom zouden we het gebruiken? Ik googled en vond het volgende:
http://www.programiz.com/c-programming/c-enumeration

Op dit moment klinkt het iets te technisch voor mij, dus ik denk niet dat ik begrijp wat er aan de hand is of waarom men dat zou gebruiken.

Bonus (optioneel): welk type variabele is de operator_t?


Antwoord 1, Autoriteit 100%

  1. Het is absoluut niet “te technisch”.

  2. typedeof ” en “Enum ” zijn twee compleet verschillende dingen.

  3. De basisredenen om “ENUMS” te hebben, is om “magische nummers” te vermijden:

    Laten we zeggen dat je drie ‘staten’ hebt: stop, voorzichtig en ga. Hoe vertegenwoordigt u ze in uw programma?

    One Way is om de snaarliteralen “STOP”, “VOORZICHTIG” en “GO” te gebruiken. Maar dat heeft veel problemen – inclusief het feit dat u ze niet kunt gebruiken in een C “Switch / Case” -blok.

    Nog een manier is om “ze in kaart te brengen op de getalwaarden” 0 “,” 1 “en” 2 “. Dit heeft veel voordelen. Maar het zien van” stop “in uw code is een stuk zinvoller dan het zien van een” 0 “. Gebruik” 0 “in uw code zoals dat is een voorbeeld van een” magisch nummer “. Magische nummers zijn slecht: u wilt in plaats daarvan een” zinvolle naam “gebruiken.

Voordat opsommingen in de taal werden geïntroduceerd, gebruikten C-programmeurs macro’s:

  #define STOP 0
   #define CAUTION 1
   #define GO 2

Een betere, schonere benadering in moderne C/C++ is om in plaats daarvan een opsomming te gebruiken:

enum traffic_light_states {
  STOP,
  CAUTION,
  GO
}; 

Het gebruik van een “typedef” vereenvoudigt het declareren van een variabele van dit type:

typedef enum {
  STOP,
  CAUTION,
  GO
} traffic_light_states_t ; 

Antwoord 2, autoriteit 42%

typedefwordt gebruikt om een alternatieve naam voor een bestaand type te definiëren. De enumhad zo kunnen worden gedeclareerd:

enum operator_t
{
    NO_OP,
    ADDITION,
};

en dan zou je een variabele van dit type als volgt kunnen declareren:

enum operator_t x = NO_OP;

Dit is nogal uitgebreid, dus je zou typedefgebruiken om een kortere alias voor dit type te definiëren:

typedef enum operator_t operator_t;

Dit definieert operator_tals het type enum operator_twaarmee je een variabele als volgt kunt initialiseren:

operator_t x = NO_OP;

Deze syntaxis:

typedef enum
{
    NO_OP,
    ADDITION,
}   operator_t;

Heeft het hele proces in één stap, dus het definieert een (niet-gecodeerd of tagless) enumTYPE en geeft het de alias operator_t.

BONUS: operator_tis een enumGegevenstype; Lees hier meer over het: https://en.wikipedia.org/wiki/enumerated_type


Antwoord 3, Autoriteit 15%

Wat is typedef enum en waarom zouden we het gebruiken?

Er zijn twee verschillende dingen die daar gaande zijn: een typedef en een opgesomd type (een “ENUM”). Een typedef is een mechanisme voor het declareren van een alternatieve naam voor een type. Een opgesomd type is een integer-type met een bijbehorende set symbolische constanten die de geldige waarden van dat type vertegenwoordigen.

In de eerste plaatsing van de ENUM bestaat de volledige vorm van een ENUM-aangifte uit de enumTREEKKEER, gevolgd door een tag waarmee die specifieke ENUM zal worden geïdentificeerd, gevolgd door de symbolische enumconstanten in krullende haakjes . Standaard komen de ENUM-constanten overeen met opeenvolgende getalwaarden, beginnend bij nul. Bijvoorbeeld:

enum operator {
    NO_OP,
    ADDITION
};

Zoals u kunt zien, heeft het enkele overeenkomsten met een struct-verklaring, en zoals een struct-aangifte, variabelen van dat opgesomteerde type worden in dezelfde verklaring gedeclareerd:

enum operator {
    NO_OP,
    ADDITION
} op1, op2, op3;

of ze kunnen later worden aangegeven door te verwijzen naar de tag van Enum:

enum operator op4, op5;

Net als een struct-declaratie, kan de tag worden weggelaten, in welk geval het opgesomde type niet elders in de broncode kan worden verwezen (maar alle gedeclareerde variabelen van dat type zijn nog steeds prima):

enum {
    NO_OP,
    ADDITION
} op1, op2, op3;

Nu komen we bij de typedef. Zoals ik al schreef, is een typedef een middel om een alternatieve naam voor een type te declareren. Het werkt door het sleutelwoord typedefvoor iets te plaatsen dat anders een variabele declaratie zou zijn; het symbool dat de variabelenaam zou zijn geweest, is dan de alternatieve naam voor het type. Bijvoorbeeld deze …

typedef unsigned long long int ull_t;

verklaart dat ull_teen alternatieve naam is voor het type unsigned long long int. De twee typenamen kunnen daarna door elkaar worden gebruikt (binnen de reikwijdte van de typedef-declaratie).

In jouw geval heb je

typedef enum
{
    NO_OP,
    ADDITION,
}   operator_t;

die operator_tdeclareert als een alias voor het opgegeven tagless enumerated type. Het op deze manier declareren van een typedef maakt de enum elders bruikbaar, via de typedef-naam, ook al is de enum tagless. Dit is een vrij algemeen mechanisme voor het declareren van een stenonaam voor een opgesomd type, en een analoge techniek is ook gebruikelijk voor structs.

Bonus (optioneel): Welk type variabele is de operator_t?

Zoals ik heb uitgelegd, is de operator_tgeen variabele, het is een type. Het is met name een opgesomd type en de symbolen NO_OPen ADDITIONvertegenwoordigen waarden van dat type.


Antwoord 4, autoriteit 4%

Typedefs voor opsommingen, structs en vakbonden zijn een complete verspilling. Ze verbergen belangrijke informatie met het twijfelachtige voordeel van het opslaan van een paar tekens om te typen.

Gebruik ze niet in nieuwe code.

Technisch gezien introduceert een typedef een alias, d.w.z. een nieuwe naam voor iets dat al bestaat. Dit betekent dat typedefs geennieuwe typen zijn. Het typesysteem behandelt ze net als het aliastype.

De downvoters zouden zichzelf kunnen onderwijzen door bijvoorbeeld het prachtige Peter van der Linden-boek Expert C Programmingte lezen waarin de argumenten tegen typedefs voor enum/struct/union worden aangevoerd.


Antwoord 5, autoriteit 2%

typedef en enum zijn twee verschillende concepten. Je kunt de code als volgt herschrijven:

enum operator
{
  NO_OP,
  ADDITION
};
typedef enum operator operator_t;

De eerste instructie declareert een opsomming genaamd operator, met twee waarden. De tweede verklaring verklaart dat de opsomming operatornu ookbekend staat als het type operator_t.

De syntaxis maakt het wel mogelijk om deze twee verklaringen in één verklaring te combineren:

typedef enum operator
 {
    NO_OP,
    ADDITION,
 } operator_t;

En tot slot om een naam voor de opsomming weg te laten, aangezien er toch een datatype voor is:

typedef enum
 {
    NO_OP,
    ADDITION,
 } operator_t;

Antwoord 6, autoriteit 2%

Wikipedia heeft een goede bespreking van wat een typedef is

typedef is een sleutelwoord in de programmeertalen C en C++. Het doel van typedef is om complexe typen te vormen van meer basale machinetypen1en eenvoudigere namen toe te wijzen tot dergelijke combinaties. Ze worden het vaakst gebruikt wanneer een standaarddefinitie of -verklaring omslachtig, mogelijk verwarrend is of per implementatie kan verschillen.
Zie deze pagina voor een gedetailleerde bespreking van Typedef in Wikipedia

Met opgesomde typen kunnen we onze eigen symbolische namen maken voor een lijst met gerelateerde ideeën.

Gezien het voorbeeld dat u gaf, vermoed ik dat u enum kunt gebruiken om te selecteren welke rekenkundige bewerking voor een bepaalde reeks variabelen moet worden gebruikt.

De volgende voorbeeldcode zou u een goed idee moeten geven van waar enum nuttig voor is.

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;
}

Als je geen enum had, zou je in plaats daarvan zoiets als dit doen:

#define ADD 0
#define SUBTRACT 1
#define MULTIPLY 2
int do_artithmetic_operation(int a, int b, int operation);

Dit alternatief is minder leesbaar, omdat de bewerking niet echt een geheel getal is, maar een symbolisch type dat een rekenkundige bewerking vertegenwoordigt die ofwel ADD, MULTIPLY of SUBTRACT is.

De volgende links bieden goede discussies en voorbeeldcode die Enum gebruikt.

http: //www.cs.utah. EDU / ~ GERMAIN / PPS / ONDERWERPEN / C_LANGUAGE / GESUMERATED_TYPES.HTML

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

http://cplus.about.com/OD/introductiontoprogramming/p /Numeration.htm

Other episodes