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

Cas*_*sey 3 c++ compiler-errors switch-statement visual-studio

为了以后的读者和我自己的理智,我希望绝对清楚地表明switch,没有default案件的陈述(由于所有案件都被覆盖)或if-elseif-else与最终不应该做任何事情的其他陈述不一致并包括对该效果的评论(参见示例).

但是,每当我defaultswitch语句中包含case 并将其保留为空时我必须在defaultcase中放置一个分号或编译错误:"Line [switch of switch of switch statement]`missing';' 在'}'之前发生.为什么?!

示例:生成编译器错误

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

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

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

K-b*_*llo 12

因为您需要为您的default案例提供声明.分号是空语句.


Ste*_*sop 9

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

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

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

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

也就是说,我不知道为什么标签声明的语法不允许的动机是什么.如果它确实存在,那么如果你写的话会出现语法上的歧义,无论是声明属于,还是没有自己的陈述,但紧接着是一个.毫无疑问它意味着什么,但也许人们认为它会搞砸人们的解析器.default: statementoptdefault : case 1: break;case 1: break;default:default: