【问题标题】:Initialize typedef enum to string将 typedef 枚举初始化为字符串
【发布时间】:2018-06-24 20:58:31
【问题描述】:

他们是用 C 语言将 typedef 枚举初始化为字符串的简单方法吗?例如,我想将以下 typedef 枚举初始化为其对应的字符串:

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

就像在 C (char* foo = "+") 中初始化任何字符串一样,我如何将 foo 的每个成员初始化为其对应的字符串? 例如MINUS = "-" 等。我知道每个成员都表示为一个 int,但我不知道该怎么做,因为每个成员都表示为一个 int。

【问题讨论】:

  • "+" 是字符串文字,而不是 int。相比之下,'+' 是一个 int。
  • 您可以使用typedef enum {ADD='+', PLUS='+', MINUS='-', ...} foo; 将常量初始化为整数值(注意单引号。)如果需要字符串,您还可以使用更精细的enum 值到字符串的映射:@ 987654327@是一种方式,可以使用foo_string[ADD]获取"+"。诸如 GNU AutoGen 之类的代码生成器可以为您执行此操作,因此您无需担心映射错误。但是,您不能直接将 enum 值设置为字符串。

标签: c string enums typedef


【解决方案1】:

枚举表示为整数值,因此您不能分配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]);
}

【讨论】:

【解决方案2】:

确保符号与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;
}

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    相关资源
    最近更新 更多