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

时间:2013-01-28 20:38:05

标签: 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;
 }   

块开放意味着声明一些局部变量,但是右括号错误放置并发生在case 63之后。

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

怎么可能?这是正确的C语法吗?

3 个答案:

答案 0 :(得分:15)

case语句就像goto标签一样,因此允许使用语法。 Duff's device是一个着名的用例。

尽量避免这样做。

答案 1 :(得分:5)

6.8.1标记语句,C99

  

任何语句前面都可以有一个声明标识符的前缀   作为标签名称。 标签本身不会改变流量   控制,继续畅通无阻。

即。花括号对switch-case标签的工作方式没有影响,但它只是创建了一个新的范围。

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

答案 2 :(得分:3)

令人惊讶的是,根据语言标准,这是正确的语法。你甚至可以这样做:

switch (m) break;

或者这个:

switch (m);

case const-expr:非常类似于您与goto一起使用的常规标签。