Szukaj…


Uwagi

Wyliczenia składają się ze słowa kluczowego enum i opcjonalnego identyfikatora, po którym następuje lista wyliczająca ujęta w nawiasy klamrowe.

Identyfikator jest typu int .

Lista wyliczająca zawiera co najmniej jeden element wyliczający .

Moduł wyliczający może opcjonalnie zostać „przypisany” do stałego wyrażenia typu int .

Moduł wyliczający jest stały i jest zgodny z char , podpisaną liczbą całkowitą lub liczbą całkowitą bez znaku. To, co kiedykolwiek jest używane, jest zdefiniowane w implementacji . W każdym przypadku zastosowany typ powinien być w stanie reprezentować wszystkie wartości zdefiniowane dla danego wyliczenia.

Jeśli żadne wyrażenie stałe nie jest „przypisane” do modułu wyliczającego i jest to pierwszy wpis na liście modułu wyliczającego , przyjmuje on wartość 0 , w przeciwnym razie otrzymuje wartość poprzedniego wpisu na liście modułu wyliczającego plus 1.

Używanie wielu „przypisań” może prowadzić do tego, że różne jednostki wyliczające tego samego wyliczenia mają te same wartości.

Proste wyliczenie

Wyliczenie jest zdefiniowanym przez użytkownika typem danych składającym się ze stałych całkowych, a każdej stałej całkowej nadaje się nazwę. Hasło enum jest używany do definiowania typu wyliczeniowego danych.

Jeśli użyjesz enum zamiast int lub string/ char* , zwiększysz sprawdzanie czasu kompilacji i unikniesz błędów w przekazywaniu niepoprawnych stałych oraz udokumentujesz, które wartości są dozwolone w użyciu.

Przykład 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);
}

Z główną funkcją zdefiniowaną w następujący sposób (na przykład):

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

Przykład 2

(W tym przykładzie użyto wyznaczonych inicjatorów, które są znormalizowane od C99).

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

Ten sam przykład z wykorzystaniem sprawdzania zakresu:

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

Istnieje kilka możliwości i konwencji nazywania wyliczenia. Pierwszym z nich jest użycie nazwy znacznika tuż po słowie kluczowym enum .

enum color
{ 
    RED, 
    GREEN, 
    BLUE 
};

Wymienionego wyliczenia należy zawsze używać ze słowem kluczowym i tagiem w następujący sposób:

enum color chosenColor = RED;

Jeśli użyjemy typedef bezpośrednio podczas deklarowania enum , możemy pominąć nazwę znacznika, a następnie użyć typu bez słowa kluczowego enum :

typedef enum 
{ 
    RED, 
    GREEN, 
    BLUE 
} color;

color chosenColor = RED;

Ale w tym ostatnim przypadku nie możemy użyć go jako enum color , ponieważ nie użyliśmy nazwy znacznika w definicji. Jedną z powszechnych konwencji jest używanie obu, tak aby można było używać tej samej nazwy z lub bez słowa kluczowego enum . Ma to tę szczególną zaletę, że jest kompatybilny z 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;

Funkcjonować:

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

Aby uzyskać więcej informacji na temat typedef zobacz Typedef

Wyliczenie ze zduplikowaną wartością

Wartość wyliczeń w żadnym wypadku nie musi być unikalna:

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

Przykładowe odbitki:

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

stała wyliczenia bez nazwy typu

Typy wyliczeń można również zadeklarować bez nadawania im nazwy:

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

To pozwala nam zdefiniować stałe czasowe kompilacji typu int które mogą być użyte w tym przykładzie jako długość tablicy.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow