c - 在 C 中打印枚举映射映射

标签 c gcc macros

我经常在 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 ();
}

以上都是常见的做法,不依赖于特定的编译器(它应该与 gccclangtccicc 或任何 C99 兼容的编译器)。

此外,如果你有一个很大的代码库(比你可以用最近的 gcc 编译),你有数百个 enum 而你不想要为他们中的每一个玩这样的把戏,你可以,例如开发一个 GCC 插件或扩展(例如在 MELT 中)以生成 - 使用代码的 GCC 内部表示 - 仅来自 enum 声明的类似 C 代码。如果您正在编写新软件,或者您非常了解您的软件基础,​​您可以用类似的技巧替换 enum 代码。

关于c - 在 C 中打印枚举映射映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12761717/

相关文章:

c - 在C中逐行写入文件

c - 在 C 中使用 unsigned int 位域结构时出错

c - 为什么宏函数不是按值调用?

C++ 在 if 条件下使用 g++ 定义一个静态变量

c - 如何在结构体中包含宏

cmp je/jg 他们如何在汇编中工作

encryption - 是什么导致 XOR 加密返回 "blank"?

c++ - iOS - GCC 无法看到似乎清晰可见的功能

java - 如何从java捕获错误并打印c程序触发器的流

c - __libc_start_main 中发生了什么?