好的,我们先不谈C++。C++只是C的超集(这意味着C中所有能做到的事情在C++中同样也能做到)。因此,我们将专注于纯C(因为那是我熟悉的语言)。C有枚举:
enum fruit { apple, banana, cherry, peach, grape };
这是完全合法的C语言,值是连续的,苹果的值为零,香蕉的值为苹果加一。你可以创建有空缺的枚举,但只有在你明确地制造空洞时才能这样做。
enum fruit { apple = 0, banana, cherry = 20, peach, grape };
虽然苹果是0,香蕉是1,樱桃是20,因此桃子是21,葡萄是22,而1到20之间的所有内容都是未定义的。通常你不想要这些空缺。你可以采取以下措施:
enum fruit { apple = 0, banana, cherry, peach, grape };
enum fruit myFruit = banana;
myFruit++;
// myFruit is now cherry
printf("My fruit is cherry? %s\n", myFruit == cherry ? "YES" : "NO");
这将打印出YES。你也可以进行以下操作:
enum fruit { apple = 0, banana, cherry = 20, peach, grape };
enum fruit myFruit = banana;
myFruit++;
// myFruit is now cherry
printf("My fruit is cherry? %s\n", myFruit == cherry ? "YES" : "NO");
这将打印出“NO”,并且myFruit的值与任何枚举常量都不相同。
顺便提一下,为了避免这种情况,您可以使用typedef避免枚举。只需在自己的行上使用“typedef enum fruit fruit;”。现在,您可以说“fruit myFruit”而无需在前面添加enum。通常在定义枚举时直接完成此操作。
typedef enum fruit { apple = 0, banana, cherry, peach, grape } fruit;
fruit myFruit;
缺点是你不再知道水果是一个枚举,它可能是一个对象、一个结构或其他任何东西。我通常避免这种类型的typedef,我更喜欢在枚举前面写enum,在结构前面写struct(我只是在这里使用它们,因为它看起来更好)。
获取字符串值是不可能的。在运行时,枚举只是一个数字。这意味着,如果你不知道是什么类型的枚举(因为0可能是苹果,但它也可能是不同枚举集合中的不同事物),那么就不可能做到。然而,如果你知道它是一个水果,那么编写一个可以为你完成此操作的函数就很容易了。预处理器是你的朋友 :-)。
typedef enum fruit {
apple = 0,
banana,
cherry,
peach,
grape
} fruit;
#define STR_CASE(x) case x: return #x
const char * enum_fruit_to_string(fruit f) {
switch (f) {
STR_CASE(apple); STR_CASE(banana); STR_CASE(cherry);
STR_CASE(peach); STR_CASE(grape);
}
return NULL;
}
#undef STR_CASE
static void testCall(fruit f) {
printf("I got called with fruit %s\n", enum_fruit_to_string(f));
}
int main(int argc, char ** argv) {
printf("%s\n", enum_fruit_to_string(banana));
fruit myFruit = cherry;
myFruit++;
printf("%s\n", enum_fruit_to_string(myFruit));
testCall(grape);
return 0;
}
输出:
banana
peach
I got called with fruit grape
这正是您想要的吗?还是我完全走错了方向?
for a_fruit in fruit'Range loop
。 - Jossi