我经常在 C 中使用 enum
来访问带有数字数据的数组元素,例如
#define KEYS_MAX 1
#define FIELD_MAX 2
enum {FIELD1=0, FIELD2};
double array[KEYS_MAX][FIELD_MAX];
array[1][FIELD1] = 1.0; array[1][FIELD2] = 2.0;
然后我将数据打印到 KEYS_MAX
行和 FIELD_MAX
列的文件中。为了稍后了解列的内容,我想打印标题行。
# KEY FIELD1 FIELD2
1 1.0 2.0
即使我通过仅更改 enum
来更新代码,我也希望有一个在运行时正确执行此操作的例程。即,如何使用 C 代码打印标题行,并可能使用独立于 enum
更新的固定例程打印标题行?
我找到了这个:Mapping enum values to strings in C++ ,但我更喜欢一些也适用于英特尔编译器的东西。
最佳答案
您可以玩一些预处理器技巧。例如,在 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 插件或扩展(例如在 MELT 中)以生成 - 使用代码的 GCC 内部表示 - 仅来自 enum
声明的类似 C 代码。如果您正在编写新软件,或者您非常了解您的软件基础,您可以用类似的技巧替换 enum
代码。
关于c - 在 C 中打印枚举映射映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12761717/