C语言 将 typedef 枚举初始化为字符串



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

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

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

枚举表示为整数值,因此不能分配类型为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): %sn", OR, fooStrings[OR]);
}

确保符号与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: %sn", foo_title[foo], foo_strings[foo]);
printf("DIV: %s.n", foo_strings[DIV]);
return 0;
}
  • https://en.wikipedia.org/wiki/X_Macro
  • http://www.drdobbs.com/the-new-c-x-macros/184401387

最新更新