C++ c++;:switch语句在右大括号前缺少分号

C++ c++;:switch语句在右大括号前缺少分号,c++,visual-studio,compiler-errors,switch-statement,C++,Visual Studio,Compiler Errors,Switch Statement,为了未来读者的利益和我自己以后的理智,我想明确指出,switch语句没有default案例(因为所有案例都被涵盖)或顺序如果elseif else,最后一个else不应做任何事情,不得省略,并包括对此的注释(参见示例) 但是,每当我在switch语句中包含default大小写并将其保留为空时,我必须在default大小写中加上分号,否则会出现编译器错误:“Line[Line of closing brace of switch语句]`missing';'before'}'在默认值之后。

为了未来读者的利益和我自己以后的理智,我想明确指出,
switch
语句没有
default
案例(因为所有案例都被涵盖)或顺序
如果elseif else
,最后一个else不应做任何事情,不得省略,并包括对此的注释(参见示例)

但是,每当我在
switch
语句中包含
default
大小写并将其保留为空时,我必须在
default
大小写中加上分号,否则会出现编译器错误:“Line[Line of closing brace of switch语句]`missing';'before'}'<为什么

示例:生成编译器错误

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 */;
}
示例:不生成编译器错误

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 */;
}

因为您的
默认情况下需要一条语句。分号是一个空语句。

因为您的
默认情况下需要一个语句。分号是一个空语句。

labeled-statement: identifier : statement case constant-expression : statement default : statement 标记语句: 标识符:语句 case常量表达式:语句 默认值:语句 C++11与此相同,只是可以在标签前面有属性

一个零长度的令牌序列不是C++中的语句,因此<代码>默认:本身不是标记语句。


也就是说,我不知道为什么标记语句的语法不允许
default:statementopt
。如果是这样的话,那么如果你写
default:case1:break,是否<代码>案例1:断裂
是属于
default:
的语句,或者
default:
是否没有自己的语句,但后面紧跟着一条语句。毫无疑问,它的意思是什么,但可能有人认为它会搞乱人们的解析器。

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

labeled-statement: identifier : statement case constant-expression : statement default : statement 标记语句: 标识符:语句 case常量表达式:语句 默认值:语句 C++11与此相同,只是可以在标签前面有属性

一个零长度的令牌序列不是C++中的语句,因此<代码>默认:本身不是标记语句。


也就是说,我不知道为什么标记语句的语法不允许
default:statementopt
。如果是这样的话,那么如果你写
default:case1:break,是否<代码>案例1:断裂
是属于
default:
的语句,或者
default:
是否没有自己的语句,但后面紧跟着一条语句。毫无疑问,这意味着什么,但可能是认为它会把人们的解析器弄乱。

FYI,默认情况下是C++中的可选……如果你想保持一致,就放一个<代码>中断;代码>默认情况下,FC++默认情况下是C++中的可选……如果你想保持一致,请放一个<代码>中断;代码>在默认值之后。