Zoeken…


Opmerkingen

Opsommingen bestaan uit het enum trefwoord en een optionele identificatie gevolgd door een opsommingslijst tussen accolades.

Een ID is van het type int .

De tellerlijst heeft ten minste één tellerelement .

Een teller kan optioneel een constante uitdrukking van het type int worden "toegewezen".

Een teller is constant en compatibel met een char , een geheel getal of een geheel getal zonder teken. Welke ooit wordt gebruikt, is implementatie-gedefinieerd . In elk geval moet het gebruikte type in staat zijn om alle waarden weer te geven die voor de betreffende opsomming zijn gedefinieerd.

Als er geen constante uitdrukking is "toegewezen" om een teller en het is de 1 ste vermelding in een enumerator-list duurt waarde van 0 , anders krijgen neemt de waarde van de vorige vermelding in de enumerator-lijst plus 1.

Het gebruik van meerdere "toewijzingen" kan ertoe leiden dat verschillende enumerators van dezelfde opsomming dezelfde waarden hebben.

Eenvoudige opsomming

Een opsomming is een door de gebruiker gedefinieerd gegevenstype dat uit integrale constanten bestaat en elke integrale constante een naam krijgt. Trefwoord enum wordt gebruikt om opgesomd gegevenstype te definiëren.

Als u enum plaats van int of string/ char* , verhoogt u de compilatietijd en voorkomt u fouten door ongeldige constanten door te geven en documenteert u welke waarden legaal zijn.

voorbeeld 1

enum color{ RED, GREEN, BLUE };

void printColor(enum color chosenColor)
{
    const char *color_name = "Invalid color";
    switch (chosenColor)
    {
       case RED:
         color_name = "RED";
         break;
       
       case GREEN:
        color_name = "GREEN";
        break;    

       case BLUE:
        color_name = "BLUE";
        break;
    }
    printf("%s\n", color_name);
}

Met een hoofdfunctie die als volgt is gedefinieerd (bijvoorbeeld):

int main(){
    enum color chosenColor;
    printf("Enter a number between 0 and 2");
    scanf("%d", (int*)&chosenColor);
    printColor(chosenColor);
    return 0;
}
C99

Voorbeeld 2

(In dit voorbeeld worden aangewezen initializers gebruikt die sinds C99 zijn gestandaardiseerd.)

enum week{ MON, TUE, WED, THU, FRI, SAT, SUN };
     
static const char* const dow[] = { 
  [MON] = "Mon", [TUE] = "Tue", [WED] = "Wed", 
  [THU] = "Thu", [FRI] = "Fri", [SAT] = "Sat", [SUN] = "Sun" };
    
void printDayOfWeek(enum week day) 
{ 
   printf("%s\n", dow[day]);
}

Hetzelfde voorbeeld met bereikcontrole:

enum week{ DOW_INVALID = -1, 
  MON, TUE, WED, THU, FRI, SAT, SUN, 
  DOW_MAX };
     
static const char* const dow[] = { 
  [MON] = "Mon", [TUE] = "Tue", [WED] = "Wed", 
  [THU] = "Thu", [FRI] = "Fri", [SAT] = "Sat", [SUN] = "Sun" };
    
void printDayOfWeek(enum week day) 
{ 
   assert(day > DOW_INVALID && day < DOW_MAX);
   printf("%s\n", dow[day]);
}

Typedef enum

Er zijn verschillende mogelijkheden en conventies om een opsomming te noemen. De eerste is om een tagnaam te gebruiken vlak achter het enum trefwoord.

enum color
{ 
    RED, 
    GREEN, 
    BLUE 
};

Deze opsomming moet dan altijd worden gebruikt met het trefwoord en de tag als volgt:

enum color chosenColor = RED;

Als we typedef rechtstreeks gebruiken bij het declareren van het enum , kunnen we de typedef weglaten en vervolgens het type zonder het enum :

typedef enum 
{ 
    RED, 
    GREEN, 
    BLUE 
} color;

color chosenColor = RED;

Maar in dit laatste geval kunnen we het niet als enum color , omdat we de tagnaam niet in de definitie hebben gebruikt. Een veel voorkomende conventie is om beide te gebruiken, zodat dezelfde naam kan worden gebruikt met of zonder enum trefwoord. Dit heeft het bijzondere voordeel dat het compatibel is met C ++

enum color                /* as in the first example */
{ 
    RED, 
    GREEN, 
    BLUE 
};
typedef enum color color; /* also a typedef of same identifier */

color chosenColor  = RED;
enum color defaultColor = BLUE;

Functie:

void printColor()
{
    if (chosenColor == RED)
    {
        printf("RED\n");
    }
    else if (chosenColor == GREEN)
    {
        printf("GREEN\n");    
    }
    else if (chosenColor == BLUE)
    {
        printf("BLUE\n");
    }
}

Zie typedef voor meer informatie over typedef

Telling met dubbele waarde

Een opsommingswaarde hoeft op geen enkele manier uniek te zijn:

#include <stdlib.h> /* for EXIT_SUCCESS */
#include <stdio.h> /* for printf() */


enum Dupes
{
   Base, /* Takes 0 */
   One, /* Takes Base + 1 */
   Two, /* Takes One + 1 */
   Negative = -1,
   AnotherZero /* Takes Negative + 1 == 0, sigh */
};

int main(void)
{
  printf("Base = %d\n", Base);
  printf("One = %d\n", One);
  printf("Two = %d\n", Two);
  printf("Negative = %d\n", Negative);
  printf("AnotherZero = %d\n", AnotherZero);

  return EXIT_SUCCESS;
}

Het voorbeeld wordt afgedrukt:

Base = 0
One = 1
Two = 2
Negative = -1
AnotherZero = 0

opsomming constant zonder typenaam

Opsommingstypen kunnen ook worden gedeclareerd zonder ze een naam te geven:

  enum { buffersize = 256, };
  static unsigned char buffer [buffersize] = { 0 };

Dit stelt ons in staat compilatietijdconstanten van het type int te definiëren die, zoals in dit voorbeeld, als arraylengte kunnen worden gebruikt.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow