0

我经常enum在 C 中使用数字数据访问数组元素,例如

#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++,但我更喜欢也可以与 intel 编译器一起使用的东西。

4

1 回答 1

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 插件或扩展(例如在MELTenum中)来生成 - 使用代码的 GCC 内部的内部表示 - 仅来自声明的类似 C 代码。如果您正在编写一个新软件,或者您非常了解您的软件基础,​​您可以enum用类似的技巧替换代码。

于 2012-10-06T16:53:57.767 回答