在C中打印枚举映射映射

时间:2012-10-06 16:45:51

标签: 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来更新代码。即,如何使用独立于enum更新的固定例程使用C代码和可能的宏来打印标题行?

我发现了这个:Mapping enum values to strings in C++,但我更喜欢可以使用intel编译器的东西。

1 个答案:

答案 0 :(得分:4)

你可以玩一些预处理器技巧。作为一个例子,在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代码。