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

问题描述 投票:3回答:2

为了未来读者的利益和我自己的理智,我想明确表示switch声明没有default案件(由于所有案件都被覆盖)或顺序if-elseif-else与最后的其他不应该做任何事情必须不得省略,并包含对该效果的评论(参见示例)。

但是,每当我在default语句中包含switch案例并将其保留为空时,我必须在default案例中放置一个分号或编译器错误:“行[switch switch of line statement of line statement]`missing';'在'}'之前发生。为什么?!

示例:生成编译器错误

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 */;
}
c++ visual-studio compiler-errors switch-statement
2个回答
9
投票

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

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:是否没有自己的声明,而是紧接着是一个声明歧义。毫无疑问它意味着什么,但也许它被认为会弄乱人们的解析器。


12
投票

因为你需要一个声明你的default案件。分号是空语句。

© www.soinside.com 2019 - 2024. All rights reserved.