Инициализировать перечисление typedef в строку - PullRequest
0 голосов
/ 24 июня 2018

Это простой способ инициализировать перечисление typedef для строки в C? Например, я хотел бы инициализировать следующее перечисление typedef для его строкового аналога:

typedef enum 
{ 
    ADD, 
    PLUS, MINUS, MUL, DIV, MOD, 
    AND, OR, NOT, 
    BROKEN_FOO
} foo;

Точно так же, как инициализировать любую строку в C (char* foo = "+"), , как я мог бы инициализировать каждый элемент foo его строковым аналогом? Например. MINUS = "-" и т. Д. Я знаю, что каждый член представлен как int, но я не уверен, как это сделать, учитывая, что каждый член представлен как int.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Альтернатива, обеспечивающая выравнивание символа с enum,

#include <stdio.h>

#define OPS \
    X(ADD, +), \
    X(PLUS, +), \
    X(MINUS, -), \
    X(MUL, *), \
    X(DIV, /), \
    X(MOD, %), \
    X(AND, &), \
    X(OR, |), \
    X(NOT, ^)

#define X(a, b) a
enum Foo { OPS };
#undef X

#define X(a, b) #b
static const char *const foo_strings[] = { OPS };
#undef X

static const unsigned foo_size = sizeof foo_strings / sizeof *foo_strings;

#define X(a, b) #a
static const char *const foo_title[] = { OPS };
#undef X

int main(void) {
    unsigned foo;
    for(foo = 0; foo < foo_size; foo++)
        printf("%s: %s\n", foo_title[foo], foo_strings[foo]);
    printf("DIV: %s.\n", foo_strings[DIV]);
    return 0;
}
0 голосов
/ 25 июня 2018

Перечисления представлены как целые значения, поэтому вы не можете присвоить значения типа char*.Однако вы могли бы поддерживать отдельный массив строк, соответствующих перечисляемым значениям:

typedef enum
{
    ADD = 0,
    PLUS = 1, MINUS = 2, MUL = 3, DIV = 4, MOD = 5,
    AND = 6, OR = 7, NOT = 8,
    BROKEN_FOO = 9
} foo;

const char* fooStrings[] = {
   "+","+","-","*","/","%","&","|","^",NULL
};

int main() {

    printf("OR (%d): %s\n", OR, fooStrings[OR]);
}
...