访问结构中定义的枚举值

时间:2011-12-01 08:31:07

标签: c++ enums

结构如下:

struct padData 
{
    enum buttonsAndAxes
    {
        select,
        start,
        ps
    };
};

struct 的对象:

padData        pad;

我按如下方式访问此枚举:

printf ("\n%d", pad.buttonsAndAxes[0]);

错误:

error: invalid use of ‘enum padData::buttonsAndAxes’

然后,我试过了:

printf ("\n%d", pad::buttonsAndAxes[0]);

错误:

error: ‘pad’ is not a class or namespace

现在怎样?请指导。

编译器: gcc版本4.5.0

编辑1: _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __

printf ("\nemit: %d", padData::(select)0);

结果:

error: expected unqualified-id before ‘(’ token

我的目标是通过其值0获取“选择”一词。如何实现?另外,单词“select”是一个字符串吗?

4 个答案:

答案 0 :(得分:2)

枚举值成为类范围内的名称。所以你可以在课堂外使用padData::select,或者在课堂内使用select

在C ++ 11中,您可以使用枚举名称限定枚举数,从外部提供padData::buttonsAndAxes::select,从内部提供buttonsAndAxes::select


在C ++中打印枚举器的名称并不容易,因为编译后名称已经消失。您需要设置一个表,手动将值映射到它们的字符串。如果您没有像示例中那样提供显式值,则只需使用数组:

enum buttonsAndAxes
{
    select,
    start,
    ps
};

const char* buttonsAndAxesNames[] = {
    "select",
    "start",
    "ps"
};

然后你索引到那个数组:

 printf("%s", buttonsAndAxesNames[select]);

如果你想要一些更复杂的方法,你可以在previous questions找到一堆技巧。

答案 1 :(得分:2)

printf ("\n%d", padData::select);

枚举不是数组,没有索引就可以使用。

答案 2 :(得分:1)

ENUMS主要用于提高代码的可读性,而不是计算辅助器。除非另有说明,否则ENUMS主要是指定值0,1,2等的文字。所以你应该总是使用“::”限定而不是数组

答案 3 :(得分:1)

你似乎需要一本好的C ++书。

C和C ++中的枚举是一种方便的方法:

  • 将整数值映射到“智能”名称
  • 将属于一起的值组合在一起

语法非常简单(在C ++ 03中):

enum <enum-name> {
  <value-name-0> [= <value-0>],
  <value-name-1> [= <value-1>],
  ...
};

其中:

  • <enum-name>是引入的类型的名称
  • <value-name-X>是枚举值
  • 的名称
  • <value-X>是给名称的值,是可选的

如果没有给名字赋值:

  • 如果是第一个,则设置为0
  • 其他,它设置为以前名称+ 1
  • 的值

这是一个展示枚举使用的小例子:

enum Color {
  Blue,
  Green,
  Red
};

char const* name(Color c) {
  switch(c) {
  case Blue: return "Blue";
  case Green: return "Green";
  case Red: return "Red";
  }
  assert(0 && "Who stored crap in my enum ?");
}

这说明了一些重要的观点:

  • Color类型,类似于结构类型或类类型。它可以是typedefed等等。
  • enum“value-name”是一个整数常量,它可以用作模板参数或用于切换案例。
  • enum“value-name”被注入声明类型的范围,而不是嵌套在其中。 (C ++ 11允许使用enum class语法来限定值)
  • 其他一些东西完全可以存储在enum中,而这不应该发生在行为良好的应用程序中,你可以通过强制转换来实现......

未显示的是,enum是一个普通的整数。确切的基础类型虽然由编译器决定。这个选择中有一些规则,对你来说无关紧要,你应该知道的是所选择的类型足够宽以包含枚举的所有值(如果需要可能签名)。这意味着所选择的类型不一定是普通int

因此:printf("%d", Green);是编程错误。它应该是printf("%d", (int)Green);

另一个重点是,枚举名称不会出现在最终的二进制文件中。名称直接替换它们的值,根本没有运行时开销。调试器通常从调试信息中检索名称(如果可用),并在向您提供信息时替换它们。