我刚刚在我维护的一些代码中发现了以下部分:
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语法吗?
答案 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
一起使用的常规标签。