如何在 C 中使用枚举

新手上路,请多包涵

假设我们有一个 enum 如下所示:

 enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};

我想创建一个实例 enum 并用适当的值初始化它,所以我这样做:

 Days day = Days.Saturday;

现在我想用现有的 enum 值检查我的变量或实例,所以我这样做:

 if (day == Days.Saturday)
{
    std::cout << "Ok its Saturday";
}

这给了我一个编译错误:

错误:“。”之前的预期主表达式令牌

所以要清楚,说之间有什么区别:

 if (day == Days.Saturday) // Causes compilation error

if (day == Saturday)

?

这两个实际上指的是什么,一个是可以的,一个会导致编译错误?

原文由 Hossein 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 477
2 个回答

这段代码是错误的:

 enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Days.Saturday;
if (day == Days.Saturday)

因为 Days 不是范围,也不是对象。它是一种类型。并且类型本身没有成员。你写的相当于 std::string.clearstd::string 是一种类型,所以不能在其上使用 . 。您在类的 实例 上使用 .

不幸的是,枚举是神奇的,所以类比到此为止。因为有了一个类,你可以做 std::string::clear 来获取一个指向成员函数的指针,但是在 C++03 中, Days::Sunday 是无效的。 (这是可悲的)。这是因为 C++(在某种程度上)与 C 向后兼容,并且 C 没有命名空间,因此枚举必须在全局命名空间中。所以语法很简单:

 enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Saturday;
if (day == Saturday)

幸运的是, Mike Seymour 发现这已在 C++11 中得到解决。将 enum 更改为 enum class 并获得自己的范围;所以 Days::Sunday 不仅有效,而且是访问 Sunday唯一 方法。快乐的时光!

原文由 Mooing Duck 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果我们想要严格的类型安全和范围枚举,在 C++11 中使用 enum class 很好。

如果我们必须在 C++98 中工作,我们可以使用 InitializeSahibSan 给出的建议来启用作用域枚举。

如果我们还想要严格的类型安全,下面的代码可以实现类似 enum 的东西。

 #include <iostream>
class Color
{
public:
    static Color RED()
    {
        return Color(0);
    }
    static Color BLUE()
    {
        return Color(1);
    }
    bool operator==(const Color &rhs) const
    {
        return this->value == rhs.value;
    }
    bool operator!=(const Color &rhs) const
    {
        return !(*this == rhs);
    }

private:
    explicit Color(int value_) : value(value_) {}
    int value;
};

int main()
{
    Color color = Color::RED();
    if (color == Color::RED())
    {
        std::cout << "red" << std::endl;
    }
    return 0;
}

代码修改自《Effective C++ 3rd: Item 18》一书中的 Month 类示例

原文由 Xu Hui 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题