好的,让我们暂时搁置 C++。C++ 只是 C 的超集(这意味着可以在 C 中完成的所有事情也可以在 C++ 中完成)。所以让我们专注于plain-C(因为这是我熟悉的语言)。C有枚举:
enum fruit { apple, banana, cherry, peach, grape };
这是完全合法的 C 并且值是连续的,apple 的值为 0,banana 的值为 apple + 1。您可以创建带有孔的枚举,但前提是您明确地制作这样的孔
enum fruit { apple = 0, banana, cherry = 20, peach, grape };
apple 为 0,banana 为 1,cherry 为 20,因此 peach 为 21,grape 为 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 的值与任何枚举常量都不相同。
顺便说一句,为避免您必须说“enum fruit myFruit”,您可以使用 typedef 避免枚举。只需使用“typedef enum fruitfruit;” 在自己的线上。现在你可以说“fruit myFruit”,前面没有枚举。通常在定义枚举时直接完成:
typedef enum fruit { apple = 0, banana, cherry, peach, grape } fruit;
fruit myFruit;
缺点是你不再知道fruit 是一个枚举,它可能是一个对象、一个结构或其他任何东西。我通常避免使用这些类型的 typedef,如果是 enum,我宁愿在前面写 enum,如果是 struct,我宁愿在前面写 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) {
// I have no idea what fruit will be passed to me, but I know it is
// a fruit and I want to print the name at runtime
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++; // myFruit is now peach
printf("%s\n", enum_fruit_to_string(myFruit));
// I can also pass an enumeration to a function
testCall(grape);
return 0;
}
输出:
banana
peach
I got called with fruit grape
这正是您想要的,还是我完全走错了路?