提问人:lajos 提问时间:8/30/2008 最后编辑:LorenzoDonati4Ukraine-OnStrikelajos 更新时间:10/1/2013 访问量:2091
在 C 中为 typedef 枚举添加预定义数据
Add predefined data for typedef enums in C
问:
在 C 中为 typedef 枚举定义其他数据的最佳方法是什么?
例:
typedef enum {
kVizsla = 0,
kTerrier = 3,
kYellowLab = 10
} DogType;
现在我想为每个定义名称,例如应该是“vizsla”。
我目前使用一个函数,该函数使用一个大的开关块返回一个字符串。kVizsla
答:
这是一个开放式的问题,但一个建议是使用一个映射,其中枚举作为键类型,值中的额外信息。(如果索引是连续的,则与示例不同,可以使用序列容器而不是映射)。
如果枚举值足够密集,则可以定义一个数组来保存字符串并查找它们(对任何跳过的值使用 NULL,并在查找例程中添加特殊情况处理程序)。
char *DogList[] = {
"vizsla", /* element 0 */
NULL,
NULL,
NULL,
"terrier", /* element 3 */
...
};
这对于稀疏枚举来说效率低下。
即使枚举不密集,也可以使用结构数组来保存映射。
typedef struct DogMaps {
DogType index;
char * name;
} DogMapt;
DogMapt DogMap[] = {
{kVizsla, "vizsla"},
{kTerrier, "terrier"},
{kYellowLab, "yellow lab"},
NULL
};
第二种方法非常灵活,但它确实意味着每次需要使用数据时都要搜索映射。对于大型数据集,请考虑使用 b 树或哈希而不是数组。
这两种方法都可以推广以连接更多数据。在第一个使用结构数组,在第二种中,只需向结构添加更多成员。
当然,您需要编写各种处理程序来简化与这些数据结构的交互。
@Hershi 一定要将代码和数据分开。以上示例旨在清晰而非功能性。
我脸红地承认,我仍然使用空格分隔的平面文件来实现此目的,而不是您展示的那种结构化输入,但我的生产代码会尽可能多地从外部源读取数据。
等等,我明白你的意思是代码生成。
确定。这没有错。
我怀疑,尽管 OP 对生成的代码应该是什么样子感兴趣......
@dmckee:我认为建议的解决方案很好,但对于简单的数据(例如,如果只需要名称),可以使用自动生成的代码来增强它。虽然有很多方法可以自动生成代码,但对于这样简单的事情,我相信您可以编写一个简单的 XSLT,它接受枚举的 XML 表示形式并输出代码文件。
XML 的格式为:
<EnumsDefinition>
<Enum name="DogType">
<Value name="Vizsla" value="0" />
<Value name="Terrier" value="3" />
<Value name="YellowLab" value="10" />
</Enum>
</EnumsDefinition>
生成的代码将类似于 DMCKEE 在他的解决方案中建议的内容。
有关如何编写此类 XSLT 的信息,请尝试此处,或者只是在 google 中搜索并找到合适的教程。编写 XSLT 对 IMO 来说并不有趣,但它也不错,至少对于这些相对简单的任务是这样。
非常适合 X() 宏。这些类型的宏可以使用 C 预处理器从同一源构造枚举和数组。您只需将新数据添加到包含 X() 宏的 #define 中。
您的示例可以写成如下:
// All dog data goes in this list
#define XDOGTYPE \
X(kVizsla,0,"vizsla") \
X(kTerrier,3,"terrier") \
X(kYellowLab,10,"yellowlab")
// Dog info
typedef struct {
int val; // Defined value
char * desc; // Text description
} DogType;
// Build an array index using the Names
typedef enum {
#define X(Name,Val,Text) Name,
XDOGTYPE
#undef X
MAXDOGS
} DogIndex;
// Build a lookup table of values
DogType Dog[] = {
#define X(Name,Val,Text) {Val,Text},
XDOGTYPE
#undef X
};
// Access the values
for (i=0; i < MAXDOGS; i++)
printf("%d: %s\n",Dog[i].val,Dog[i].desc);
上一个:如何在Cygwin中执行文件?
下一个:用 C 语言编写跨平台应用
评论