我在谷歌上搜索如何迭代枚举,我发现了各种建议,比如 How can I iterate over an enum?尽管没关系,所有这些方法都必须返回迭代整数,但我发现建议的解决方案或多或少是一种黑客攻击。为什么这个操作没有得到更好的支持,还有更深层次的原因吗?或者从另一方面看,哪个更可移植(包括 C 和 C++ 之间的那个)和更符合标准?
要在 C 和 C++ 之间可移植地遍历通用枚举,只需使用查找表:
typedef enum
{
hello = 123,
world = 456
} hello_t;
const hello_t TABLE [ENUM_ITEMS] =
{
hello,
world
};
for(size_t i=0; i<ENUM_ITEMS; i++)
{
printf("%d", (int)TABLE[i]);
}
不幸的是,没有办法以编程方式获取常量 ENUM_ITEMS
,除非您有一个未分配任何值的非特定枚举,例如 enum { hello, world, ENUM_ITEMS }
。如果一些枚举常量被显式分配了数字,那么你只能像这样做一些 hack-ish 的事情:
typedef enum
{
ENUM_START = __LINE__,
hello = 123,
world = 456,
ENUM_ITEMS = __LINE__ - ENUM_START - 1
} hello_t;
我是一名优秀的程序员,十分优秀!