【问题标题】:Enum issue when converting from C++ to C从 C++ 转换为 C 时的枚举问题
【发布时间】:2021-09-03 11:05:18
【问题描述】:

我正在将我的 C++ 代码更改为 C 代码,因为我发现自己倾向于更纯粹的函数式程序,并且没有真正使用任何 C++ 功能。快速编译也是一个优点。

我的标题中的这个特殊位有问题:

void gameLoop();
void doStuff();

enum GameState
{
    MENU, PLAY, EXIT
};

GameState gameState;

我想在我的源代码中用于这样的功能:

void gameLoop() 
{
    while (gameState != GameState::EXIT)
    {
        doStuff();

    }
}

【问题讨论】:

  • 在C中你不能使用::;你需要使用while (gameState != EXIT)(这也应该在 C++ 中工作,这就是为什么在 C++ 中你应该使用枚举类。
  • 请不要修改您的问题,使答案变得毫无意义。您从问题中删除了 GameState::EXIT,现在您的 switch 语句格式不正确。
  • 很抱歉。已修复以明确的方式显示原始代码和修改后的代码
  • 如果你想要更纯粹的函数式编程,C++ 对我来说是比 C 更好的选择,因为它有 lambda 函数,实现了闭包。在纯 C 中实现真正的闭包似乎很困难而且非常冗长。

标签: c++ c enums


【解决方案1】:

正如 cmets 中所指出的,您不能在 C (there is no such operator) 中使用范围分辨率运算符 (::)。此外,如果您想将GameState 用作变量类型(如您的声明中的GameState gameState;),那么您需要显式 使用typedef 关键字将其定义为类型。

这是您发布的翻译成 C 的代码版本(另请注意明确的 void 参数列表声明):

void gameLoop(void);
void doStuff(void);

typedef enum {
    MENU, PLAY, EXIT
} GameState;

GameState gameState;

void gameLoop(void)
{
    while (gameState != EXIT) {
        doStuff();
    }
}

作为一项改进,您可能希望为枚举值添加合适的“前缀”,以避免可能与其他地方声明的类似 ID 发生冲突:

typedef enum {
    gsMENU, gsPLAY, gsEXIT
} GameState;

【讨论】:

  • enum GameState {...} gameState; 避免了污染typedef 命名空间,它变得非常拥挤。见namespaces in C
猜你喜欢
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多