访问结构体中定义的枚举的值

Accessing the values of an enum defined in a struct

本文关键字:枚举 定义 结构体 访问      更新时间:2023-10-16

结构体如下:

struct padData 
{
    enum buttonsAndAxes
    {
        select,
        start,
        ps
    };
};
结构体的对象:
padData        pad;

我按如下方式访问这个enum:

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 version 4.5.0

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

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

结果:

error: expected unqualified-id before ‘(’ token

我的目标是通过值0获取单词"select"。如何做到这一点?另外,单词"select"是字符串吗?

枚举值成为类作用域内的名称。因此,您可以从类外部使用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]);

如果你想要一些更复杂的方法,你可以在前面的问题中找到一堆技巧。

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

Enum不是数组,使用时不带索引

ENUMS主要用于提高代码的可读性,而不是简化计算。enum主要是文字,除非另有说明,否则它们被赋值为0、1、2等。所以你应该总是使用"::"限定符而不是数组

你似乎需要一本好的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>是给名称的值,是可选的

如果没有给name赋值:

  • 如果是第一个,则设置为0
  • else,设置为前一个名称的值,+ 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类型,类似于结构类型或类类型。它可以被类型定义和所有。
  • 一个enum "value-name"是一个整型常量,它可以用作模板参数或在切换情况下使用。
  • 一个enum "value-name"被注入到声明类型的作用域中,而不是嵌套在其中。(c++ 11允许用enum class语法限定值的范围)
  • 其他东西完全可以存储在enum中,而这不应该发生在行为良好的应用程序中,您可以通过强制转换来实现…

没有显示的是,enum实际上是一个普通整数。确切的底层类型由编译器自行决定。在这个选择中有一些规则,对您来说应该无关紧要,您应该知道的是,所选择的类型足够宽,可以包含枚举的所有值(如果需要,可能还有带符号的)。它所暗示的是,选择的类型不一定是普通的int

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

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