你可以玩一些预处理器技巧。例如,在 GCC 源代码树实现中,您可能会受到gcc/tree.def
文件的启发。
因此,您可能有一个文件,例如myenum.def
,其中包含诸如
MYENUM(Pink)
MYENUM(Red)
MYENUM(Ivory)
然后,您可以使用一些代码定义您的枚举,例如
enum my_enum {
#define MYENUM(Name) Name,
#include "myenum.def"
#undef MYENUM
};
(您可能想None_
在#include
上面和Last_
之后放置)
然后你可以有一个枚举到字符串转换器,例如
const char* myenum_to_string(enum my_enum en) {
switch(en) {
#define MYENUM(Name) case Name: return #Name;
#include "myenum.def"
#undef MYENUM
default: return NULL; /* should not happen */
}
}
你可能有一个字符串到枚举转换器,例如
enum myenum string_to_my_enum (const char*str) {
#define MYENUM(Name) if (!strcmp(str, #Name)) return Name;
#include "myenum.def"
#undef MYENUM
else abort ();
}
以上所有内容都是常见的做法,与特定的编译器无关(它应该与gcc
、clang
、tcc
或icc
任何符合 C99 的编译器一起使用)。
此外,如果你有一个大的代码库(比你可以用最近的编译gcc
),你有数百个enum
并且你不想为每个人都玩这样的技巧,你可以例如开发一个 GCC 插件或扩展(例如在MELTenum
中)来生成 - 使用代码的 GCC 内部的内部表示 - 仅来自声明的类似 C 代码。如果您正在编写一个新软件,或者您非常了解您的软件基础,您可以enum
用类似的技巧替换代码。