12

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

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 语法吗?

4

3 回答 3

16

这些case语句就像 goto 标签,所以这是允许的语法。Duff 的设备是一个著名的用例。

尽量避免这样做。

于 2013-01-28T20:40:12.970 回答
5

6.8.1 标记语句,C99

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

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

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

于 2013-01-28T20:45:29.410 回答
4

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

switch (m) break;

或这个:

switch (m);

case const-expr:工作起来非常像您使用的常规标签goto

于 2013-01-28T20:43:26.227 回答