C:错误嵌套的开关/外壳块令人惊讶地工作

wap*_*p26 11 c visual-studio-2010

我刚刚在我维护的一些代码中发现了以下部分:

switch (m) {
    case 62: { // opening
        // some declarations
        // do some stuff
        break;
    case 63:
        // do some other stuff
        break;
        }      // closing
    default:
        // default stuff
        break;
 }   
Run Code Online (Sandbox Code Playgroud)

块打开是为了声明一些局部变量,但是右括号被错误地放置并且发生在后面case 63.

我几个月都没有注意到这一点,因为它在Visual Studio 2010中编译得很好.我已经尝试过调试它,两种情况都可以正常工作.

怎么会这样 ?这是正确的C语法吗?

Pub*_*bby 15

case语句就像转到标签等是允许的语法.Duff的设备是一个着名的用例.

尽量避免这样做.


P.P*_*.P. 5

6.8.1标记语句,C99

任何语句都可以在前缀之前声明标识符作为标签名称.标签本身并不会改变控制流程,而这种控制流程在它们之间继续畅通无阻.

即花括号对开关盒标签的工作方式没有影响,但它只是创建了一个新的范围.

这就解释了为什么看似错位的花括号不会导致语法错误.