使用 gcc 编译时导致错误的 case break [关闭]

Posted

技术标签:

【中文标题】使用 gcc 编译时导致错误的 case break [关闭]【英文标题】:case break causing error while compiling with gcc [closed] 【发布时间】:2013-05-13 07:24:11 【问题描述】:

编译时出错: break 语句不在循环或开关内 case label '不在switch语句中

我无法附上整个代码,因为如果您坚持要查看整个内容,请告诉我,我会上传它。

void S9xSetupDefaultKeymap()
   
    S9xUnmapAllControls();

    // Build key map
    s9xcommand_t cmd;

    // Player 1

    S9xMapButton( 65, cmd = S9xGetCommandT("Joypad1 Left"), false );    // A
    S9xMapButton( 68, cmd = S9xGetCommandT("Joypad1 Right"), false );   // D
    S9xMapButton( 87, cmd = S9xGetCommandT("Joypad1 Up"), false );      // W
    S9xMapButton( 83, cmd = S9xGetCommandT("Joypad1 Down"), false );    // S

    S9xMapButton( 79, cmd = S9xGetCommandT("Joypad1 X"), false );       // O
    S9xMapButton( 80, cmd = S9xGetCommandT("Joypad1 Y"), false );       // P
    S9xMapButton( 75, cmd = S9xGetCommandT("Joypad1 A"), false );       // K
    S9xMapButton( 76, cmd = S9xGetCommandT("Joypad1 B"), false );       // L

    S9xMapButton( 88, cmd = S9xGetCommandT("Joypad1 L"), false );       // X
    S9xMapButton( 77, cmd = S9xGetCommandT("Joypad1 R"), false );       // M

    S9xMapButton( 13, cmd = S9xGetCommandT("Joypad1 Start"), false );   // Enter
    S9xMapButton( 16, cmd = S9xGetCommandT("Joypad1 Select"), false );  // Shift

    // Player 2

    S9xMapButton( 70, cmd = S9xGetCommandT("Joypad2 Left"), false );    // F
    S9xMapButton( 72, cmd = S9xGetCommandT("Joypad2 Right"), false );   // H
    S9xMapButton( 84, cmd = S9xGetCommandT("Joypad2 Up"), false );      // T
    S9xMapButton( 71, cmd = S9xGetCommandT("Joypad2 Down"), false );    // G

    S9xMapButton( 67, cmd = S9xGetCommandT("Joypad2 X"), false );       // C
    S9xMapButton( 86, cmd = S9xGetCommandT("Joypad2 Y"), false );       // V
    S9xMapButton( 66, cmd = S9xGetCommandT("Joypad2 A"), false );       // B
    S9xMapButton( 78, cmd = S9xGetCommandT("Joypad2 B"), false );       // N

    S9xMapButton( 89, cmd = S9xGetCommandT("Joypad2 L"), false );       // Y
    S9xMapButton( 85, cmd = S9xGetCommandT("Joypad2 R"), false );       // U

    S9xMapButton( 81, cmd = S9xGetCommandT("Joypad2 Start"), false );   // Q
    S9xMapButton( 69, cmd = S9xGetCommandT("Joypad2 Select"), false );  // E


    case "joypad1 down":
    break;

    case "joypad1 x":
    break;

    case "joypad1 y":
    break;

    case "joypad1 a":
    break;

    case "joypad1 b":
    break;

    case "joypad1 l":
    break;

    case "joypad1 r":
    break;

    case "joypad1 start":
    break;

    case "joypad1 select"
    break;

    // player 2

    case "joypad2 left":
    break;

    case "joypad2 right":
    break;

    case "joypad2 up":
    break;

    case "joypad2 down":
    break;

    case "joypad2 x":
    break;

    case "joypad2 y":
    break;

    case "joypad2 a":
    break;

    case "joypad2 b":
    break;

    case "joypad2 l":
    break;

    case "joypad2 r":
    break;

    case "joypad2 start":
    break;

    case "joypad2 select":
    break;

【问题讨论】:

你应该相信你的编译器告诉你的。没有 switch 语句,带有字符串的 case 不会像您期望的那样工作。获取一本书并学习基础知识... 先阅读一些基础知识。 cprogramming.com/tutorial/lesson5.html 或任何其他教程将教使用如何使用 switch 语句。 如果您不愿意回答,请不要给我一个大拇指。 我在一个开源项目中得到了这个,我不是 C++ 程序员,而且制作它的人在不知何故之前已经编译了它。 您在此处提供的这些“case”语句是不正确的(缺少“switch”,您也不能在标准 C/C++ 中将字符串用作 case)并且什么也不做(“case”之后紧跟“break” ") 所以这个程序无法按原样工作。 【参考方案1】:

case 语法示例

switch (variable)

   case 1:
      //Do stuff
      break;
   case 2:
      //Do stuff
      break;
   default:
      //Do stuff
      break;

请记住,通过使用 switch 语句,您只能处理整数变量。并且您需要指定使用switch 语句引用的变量case 语句。如果您坚持测试 char* 变量,则行为将与您预期的不同,因为您将只比较指针,而不是 char* 数组的内容。

在你的情况下,你最好使用ifelse if

【讨论】:

以上是关于使用 gcc 编译时导致错误的 case break [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 Visual Studio 而不是 GCC 编译时没有错误?

由于C++类库版本不同导致的OpenCV编译链接错误

使用 ARM GCC 编译列表迭代器时的模板编译时错误

使用 GCC 构建的变量参数的 EDK2 Shell 应用程序在运行时会导致页面错误

将弱符号和局部符号链接在一起时,可能的 GCC 链接器错误会导致错误

GCC 4.4:避免在 gcc 中对 switch/case 语句进行范围检查?