访问结构体中定义的枚举的值
Accessing the values of an enum defined in a struct
结构体如下:
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);
。
另一个重要的一点是,枚举名称不会出现在最终的二进制文件中。名称被直接替换为它们的值,完全没有运行时开销。调试器通常从调试信息(如果可用)中检索名称,并在向您呈现信息时将它们替换回去。
- 如何正确实现和访问运算符的各种自定义枚举器
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- C++:如何在声明枚举类的模板类主体之外定义枚举类?
- C2365 重新定义 VS2019 升级后,以前的定义是外部标头 + lib 的"枚举器"
- 如何在 std::p air 中使用 System::Guid 和自定义枚举?
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 当在基类中定义枚举时,qml中的Q_ENUM未定义值
- 在模板类内部定义的枚举上的嵌套类的部分专用化
- 枚举的复合赋值运算符真的应该根据其关联的算术运算符来定义吗?
- 如何检查类中定义的枚举类型变量是否被分配给?
- 在 FlatBuffer 中使用自定义枚举
- C++:使用后类中的枚举定义
- 不接受C++枚举定义
- 方便地为枚举定义按位运算符,以创建位标志
- 为嵌套在类中的枚举定义运算符
- 为什么在c++枚举定义中需要typedef
- 在类中添加枚举定义会破坏其二进制向后兼容性吗?
- 扩展枚举定义
- 用枚举定义成员函数不需要Include