结构如下:
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”是一个字符串吗?
答案 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]);
答案 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);
。
另一个重点是,枚举名称不会出现在最终的二进制文件中。名称直接替换它们的值,根本没有运行时开销。调试器通常从调试信息中检索名称(如果可用),并在向您提供信息时替换它们。