【发布时间】:2010-09-26 22:03:47
【问题描述】:
我正在尝试将一组按键映射到一组命令。因为我从多个地方处理命令,所以我想在键和命令之间设置一个抽象层,这样如果我更改底层键映射,我就不必更改太多代码。我当前的尝试如下所示:
// input.h
enum LOGICAL_KEYS {
DO_SOMETHING_KEY,
DO_SOMETHING_ELSE_KEY,
...
countof_LOGICAL_KEYS
};
static const SDLKey LogicalMappings[countof_LOGICAL_KEYS] = {
SDLK_RETURN, // Do Something
SDLK_ESCAPE, // Do Something Else
...
};
// some_other_file.cpp
...
switch( event.key.keysym.key ) {
case LogicalMappings[ DO_SOMETHING_KEY ]:
doSomething();
break;
case LogicalMappings[ DO_SOMETHING_ELSE_KEY ]:
doSomethingElse();
break;
...
}
当我尝试编译这个 (gcc 4.3.2) 时,我收到错误消息:
错误:“LogicalMappings”不能出现在常量表达式中
我不明白为什么编译器有这个问题。我理解为什么不允许在 case 语句中包含变量,但我的印象是您可以使用常量,因为它们可以在编译时进行评估。常量数组不能与 switch 语句一起使用吗?如果是这样,我想我可以用类似的东西替换数组:
static const SDLKey LOGICAL_MAPPING_DO_SOMETHING = SDLK_RETURN;
static const SDLKey LOGICAL_MAPPING_DO_SOMETHING_ELSE = SDLK_ESCAPE;
...
但这似乎不那么优雅。有人知道为什么你不能在这里使用常量数组吗?
编辑:我已经看到 C++ 标准中声称“一个整数常量表达式只能涉及文字 (2.13)、枚举数、常量变量或整数或枚举类型的静态数据成员,这些成员使用常量表达式初始化(8.5)……”。我仍然不明白为什么常量数组不能算作“用常量表达式初始化的枚举类型”。可能只是我的问题的答案是“因为它就是这样”,我将不得不解决它。但如果是这样的话,那就有点令人失望了,因为编译器确实可以在编译时确定这些值。
【问题讨论】:
-
“使用常量表达式初始化的枚举类型”类似于“MyEnum a = 12”,其中 MyEnum 是枚举类型(即使用 enum 关键字声明/定义)。枚举数组类型与作为数组的枚举类型不同。
标签: c++ arrays syntax constants switch-statement