c ++:switch语句在close括号之前缺少分号

时间:2012-05-21 18:09:27

标签: c++ visual-studio compiler-errors switch-statement

为了未来的读者和我自己的理智,我希望绝对清楚地表明switch没有default案件的陈述(由于所有案件都被覆盖)或顺序不得省略if-elseif-else以及不应做任何事情的最终其他内容,并包含对该效果的评论(参见示例)。

但是,每当我在default语句中包含switch个案并将其保留为空时,我必须在default个案例或编译器错误中加一个分号:“Line [Line of Line]关闭开关声明的大括号]`缺少';'在'}'之前发生。 为什么?!

示例:生成编译器错误

switch(direction) {
    case MOVE_UP:
    //...
    break;
    case MOVE_RIGHT:
    //...
    break;
    case MOVE_DOWN:
    //...
    break;
    case MOVE_LEFT:
    //...
    break;
    default:
        /* DO NOTHING */
}

示例:不会生成编译器错误

switch(direction) {
    case MOVE_UP:
    //...
    break;
    case MOVE_RIGHT:
    //...
    break;
    case MOVE_DOWN:
    //...
    break;
    case MOVE_LEFT:
    //...
    break;
    default:
        /* DO NOTHING */;
}

2 个答案:

答案 0 :(得分:12)

因为您需要针对default案例的陈述。分号是空语句。

答案 1 :(得分:9)

6.1 / 1在C ++ 03中给出了标签语句的语法:

labeled-statement:
    identifier : statement
    case constant-expression : statement
    default : statement

C ++ 11是相同的,除了你可以在标签之前有属性。

在C ++中,零长度标记序列不是语句,因此default:本身不是标记语句

那就是说,我不知道为什么标记语句的语法不允许default: statementopt的动机是什么。如果确实如此,那么如果你写default : case 1: break;case 1: break;是属于default:陈述,或者default:是否存在语法模糊性没有自己的陈述,但紧接着是一个。毫无疑问它意味着什么,但也许它被认为会弄乱人们的解析器。