gpt4 book ai didi

c - 在C中没有声明枚举变量的情况下使用枚举没有问题吗?

转载 作者:行者123 更新时间:2023-12-02 07:57:26 24 4
gpt4 key购买 nike

我对枚举类型变量和 int 类型变量在 C 中的工作方式有何不同感到困惑。

我听说在 C++ 中枚举类型和整数类型之间可能存在转换错误,但 C 没有。

那么如果C语言中整型变量和枚举类型变量没有区别,我可以只声明枚举名称并在不声明任何枚举类型变量的情况下使用它们吗,例如,

 ...

enum { WIN, LOSE, DRAW };

int main() {

int result;

result = play_game(...);

if (result == WIN) { ... }
else if (result == LOSE) { ... }
...

}

int play_game(...) {
...
if (...) return WIN;
else if (...) return LOSE;
else return DRAW;
...
}

如上。 (只是为了增强可读性,而不是使用无意义的数字;01210 -1等)

实际上,我无法理解声明特定枚举类型变量的含义,如下所示。

 enum GameResult { WIN, LOSE, DRAW } result;

这是否也与代码可读性有关?我的意思是,将 result 声明为 int 和声明为枚举类型变量之间有什么区别吗?

最佳答案

是的,枚举基本上是 int 的替代品。但是,您发布的代码存在一些最佳实践问题。尽管它被广泛认为是避免在 C 编程中使用“魔数(Magic Number)”的良好做法,但这个问题几乎是主观的。

也就是说,你不应该编写一个函数来返回 int012。那将是一个相当神秘的界面。但是在不改变返回类型的情况下用 enum 替换那些“魔数(Magic Number)”是草率的。它不应返回 int,而是您应该使用 typedef,例如:

typedef enum { WIN, LOSE, DRAW } game_result_t;
...
game_result_t play_game(...)

这为您提供了一种仅用于此特定目的的特殊类型。它提高了可读性并且(可以说)增加了一点点类型安全。

更好的是,以相同的方式为枚举值、函数和所有内容添加前缀,以便读者可以分辨出哪些项目属于一起:

// game.h

typedef enum { GAME_WIN, GAME_LOSE, GAME_DRAW } game_result_t;
...
game_result_t game_play (...)

现在 game.h 中的所有内容都以 game_ 为前缀,这使得查找某个常量或函数的来源变得容易,而无需挖掘/搜索代码。

关于c - 在C中没有声明枚举变量的情况下使用枚举没有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62017336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com