Какие хорошие примеры использования enum в C - PullRequest
0 голосов
/ 01 ноября 2018

Я написал этот простой код для проверки enum, но он не похож ни на что, что когда-либо использовалось бы в реальном мире. Я хотел бы знать, какими будут хорошие примеры использования enum и почему это полезно.

#include <stdio.h>

typedef enum {
    BLUE,
    GREEN,
    BROWN
} eye_color;

typedef struct {
    char *name;
    char *eyecolor;
    int height;
    int weight;
    eye_color eyes;
} person;

void print_eye_color(person p)
{
    switch(p.eyes) {
        case BLUE :
            // I didn't know what else to say... 
            printf("%s eyes are made from diamonds\n", p.eyecolor);
            break;
        case GREEN : 
            printf("%s eyes are made from emeralds\n", p.eyecolor);
            break;
        case BROWN : 
            printf("%s eyes are made from amber\n", p.eyecolor);
        default :
            printf("What colour eyes do you have?\n");
    }
}

int main()
{
    person ayla = {"Ayla", "Blue", 167, 42, BLUE};
    print_eye_color(ayla);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Перечисления помогают избежать «магических чисел», давая этим числам имя и имя. Вы можете опустить номер, и компилятор сгенерирует последовательность автоматически, но вы также можете назначить значения каждому имени самостоятельно.

Пример:

typedef enum {
    red = 0xff0000,
    green = 0x00ff00,
    blue = 0x0000ff,
    magenta = 0xff00ff,
    yellow = 0xffff00,
    cyan = 0x00ffff,
    white = 0xffffff,
    black = 0x000000
} colors_24bit;

Существует множество вариантов использования перечислений, но их конечная цель - помочь вам сделать ваш код чистым и легким для понимания.

0 голосов
/ 01 ноября 2018

Если бы я хотел написать карточную игру, я использовал бы enum для представления цвета карточек, значения и типа.

Так что я бы хотел что-то вроде:

typedef enum {
    KING, QUEEN, ACE, JACK, TEN, NINE, EIGHT, SEVEN, SIX, FIVE, FOUR, THREE, TWO
} card_value;

typedef enum {
    SPADE, HEART, DIAMOND, CLUB
} card_type;

typedef enum {
    BLACK, RED
} card_color;

Это в отличие от выполнения:

const int CARD_COLOR_RED = 1;

или хуже

const char* CARD_COLOR_RED = "Red";

Перечисления самодокументируются - мне не нужно знать, какое значение представляет перечисление RED, мне просто нужно знать, что это RED.

Это также сокращает время написания кода (эффективность работы программиста), поскольку вам не нужно думать о значениях, которые нужно присвоить своим константам, потому что, как выясняется, имя, которое вы дали, это значение, которое вы хотели иметь в первое место.

Перечисления аналогичны атомам в эрланге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...