错误:跳转到案例标签并跨越[重复]的初始化

Posted

技术标签:

【中文标题】错误:跳转到案例标签并跨越[重复]的初始化【英文标题】:error: jump to case label & crosses initialization of [duplicate] 【发布时间】:2016-07-31 17:40:23 【问题描述】:

在您标记为重复之前,我已阅读帖子 here 并且无法弄清楚这与我的代码有何关系。

我收到一些编译错误:

controller.cc: In member function ‘void Controller::start()’:
controller.cc:50:9: error: jump to case label [-fpermissive]
controller.cc:44:17: error:   crosses initialization of ‘uint32_t c’

这是我的代码:

void Controller::start()

    int curPosX = view->getWidth() / 2;
    int curPosY = view->getHeight() / 2;
    uint32_t color = 0xFFFFFF;

    DeviceHandler player = DeviceHandler("/dev/input/js0", false);
    player.flush();

    while(1)

        button_event_t press;
        bool ret = player.poll(&press);

        if(ret && press.type == PRESS)
            switch(press.name)

                case DPAD_UP:
                    curPosY += 1;
                    break;
                case DPAD_DOWN:
                    curPosY -= 1;
                    break;
                case DPAD_RIGHT:
                    curPosX += 1;
                    break;
                case DPAD_LEFT:
                    curPosX -= 1;
                    break;
                case BUTTON_LB:
                    view->clear();
                    break;
                case BUTTON_RB:
                    uint32_t c = rand() & 0xff;
                    c |= (rand() & 0xff) << 8;
                    c |= (rand() & 0xff) << 16;
                    c |= (rand() & 0xff) << 24;
                    color = c;
                    break;
                case BUTTON_A:
                    color = 0x000000;
                    break;
            

        
        //color = 0x000000;
        view->drawPixel(curPosY,curPosX, color);
        usleep(500);
    

现在问题在于case BUTTON_RB:case BUTTON_A: 语句。当我删除 case BUTTON_A: 时,它编译得很好。我在上面链接的帖子指出,仅当您在另一个 case 语句中使用初始化变量时才发生此错误,而不是在它的定义位置。这不是这里的情况。

我定义的唯一变量是uint32_t c,我不会在其他地方使用它。我已尝试按照其他帖子中的建议将这些语句转换为显式块,它可以编译但似乎无法正确捕获。

【问题讨论】:

The post I linked above has stated that this error only occurs when you use an initialized variable in another case statement other than where it was defined. 不,它没有。 确实没有这么说。这在其他问题上已经得到了很好的回答。 至于“我已尝试按照其他帖子中的建议将这些语句转换为显式块,它可以编译但似乎无法正确捕获。” ——我很难理解你的意思。没有异常处理,所以你没有使用“catch”的标准含义。如果您的意思是它没有跳转到正确的大小写标签,那就错了,它会。如果你的意思是别的,那么请更清楚你的意思。 我对这个问题投了赞成票。 C 语法不直观,case 标签不能在没有 的情况下声明。虽然这是一个重复的问题,但很容易看出另一个问题的答案是如何遗漏了足够的信息,让读者一头雾水。 【参考方案1】:

您仅在case BUTTON_RB 中使用它这一事实并没有改变它具有本地范围的事实。把它放在它自己的范围内,或者更好的是,它自己的功能。

另外,rand()真的已被弃用,如果您只使用其中一个 std 32 位随机生成器,您会更容易摆脱。

【讨论】:

以上是关于错误:跳转到案例标签并跨越[重复]的初始化的主要内容,如果未能解决你的问题,请参考以下文章

c ++初始化浮点数组时交叉初始化跳转到案例标签

导致此问题的原因:无法从 switch 语句跳转到此案例标签 [重复]

当切换到案例1时,切换语句切换到案例2

ubuntu上的静态链接pthread导致未初始化的值跳转(valgrind)[重复]

提取数组元素并将它们映射到案例类

使用 Spark 将 json 映射到案例类(字段名称中的空格)