switch的case使用数组C语言,使用常量数组的元素作为switch语句中的case

我正在尝试将一组按键映射到一组命令.因为我处理来自多个地方的命令,所以我想在键和命令之间设置一个抽象层,这样如果我更改底层键映射,我就不必更改很多代码.我目前的尝试看起来像这样:

// 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) ...".我仍然不明白为什么常量数组不算作"用常量表达式初始化的枚举类型".可能只是我的问题的答案是"因为它就是它的方式",我将不得不解决它.但如果是这种情况,那就有点令人失望,因为编译器确实可以在编译时确定这些值.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言,`switch` case分支语句是一种用于根据不同的条件执行不同代码块的控制结构。它允许您根据一个变量的值选择执行不同的代码块。 下面是`switch` case分支语句的基本语法: ```c switch (expression) { case constant-1 : // 代码块 1 break; case constant-2 : // 代码块 2 break; ... default : // 默认代码块 } ``` 在上面的语法,`expression`是一个表达式,它的值将被与`case`后面的常量进行比较。如果表达式的值与某个`case`后面的常量相匹配,那么就会执行该`case`后面的代码块。如果没有匹配的`case`,就会执行`default`代码块(如果有的话)。每个`case`后面可以有一个或多个代码块,它们按顺序执行,直到遇到`break`语句为止。 下面是一个简单的示例,演示了如何使用`switch` case分支语句: ```c #include <stdio.h> int main() { int day = 3; switch (day) { case 1: printf("Monday\n"); break; case 2: printf("Tuesday\n"); break; case 3: printf("Wednesday\n"); break; default: printf("Invalid day\n"); } return 0; } ``` 在上面的示例,变量`day`的值是3。根据它的值,程序将执行与常量3对应的代码块,即输出"Wednesday"。如果没有匹配的常量,程序将执行默认代码块(如果有的话)。在这个例子,没有使用`break`语句,因此程序将继续执行下一个`case`后面的代码块。 需要注意的是,每个`case`后面必须有一个`break`语句,否则程序将继续执行下一个`case`后面的代码块,直到遇到`break`语句为止。如果没有使用`break`语句,程序可能会进入无限循环。另外,每个`case`后面的代码块必须以分号结束。 希望这可以帮助您理解如何在C语言使用`switch` case分支语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值