他们是将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