【问题标题】:C++ enum placement confusionC++ 枚举位置混淆
【发布时间】:2015-12-01 15:02:33
【问题描述】:

我正在尝试在 C++ 中使用枚举

现在,当我将枚举放在枚举声明之上时,它就可以工作了。但是,如果我先声明枚举类型,则会收到错误“'states' 没有命名类型”。

作品

enum states
{
    DEMO, STATE1, STATE2
};
states currentState;

不起作用

states currentState;
enum states
{
    DEMO, STATE1, STATE2
};

错误

 error: 'states' does not name a type :states currentState

我最近才开始编写 Arduino 代码,而我在 C# 或 Java 中从未遇到过这个问题。

【问题讨论】:

  • 为什么你不能按照它的工作方式来做呢?
  • 对于不起作用的部分可以使用前向声明enum states;
  • 因为我喜欢将我的声明放在我的函数和/或枚举之上。如果这是 C++ 中的一件事,那就有点令人失望了
  • 这与枚举无关。您根本不能在 C++ 中使用任何以前未声明过的名称。
  • 如果像我这样的问题因为太简单而被否决,我对这个网站的社区感到非常失望。每个人都太他妈的脾气暴躁了,如果你不喜欢这个问题,请继续前进,有些人还不知道一切。

标签: c++ types enums


【解决方案1】:

您必须在使用标识符之前使用前向声明。如果必须知道大小或功能(例如类函数),则需要完整的定义。

enum states; //forward declaration.
states currentState; // OK

//some other code
void foo(states currentState); //OK

enum states
{
    DEMO, STATE1, STATE2
};

【讨论】:

  • 为什么它不起作用,你能告诉我们你使用forward declaration的代码吗?
  • @vishal 只是这样做了,它不起作用。 "此声明没有存储类或类型说明符"
  • 它在 VS2012(C++ 或 C 代码)中工作,你尝试了什么?
  • enum 不能前向声明,enum class 可以。
  • 这段代码使用带有默认标志的 VS2012 编译。这可能是 VS 特定的扩展。我没有深入研究。
【解决方案2】:

正如评论中所说,如果没有之前在 c++ 中的声明,您不能使用名称。

enum 不能前向声明,但enum class 可以(在 C++11 中引入)。

所以你可以这样做:

enum class states /* : int */ ; // forward declaration

states currentState;

enum class states /* : int */
{
    DEMO, STATE1, STATE2
};

注意enum class 与简单的enum 不同,没有显式转换为int

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多