C 编译器接受的可疑 case 语句语法

use*_*914 4 c syntax compiler-errors

我发现一个长期存在的错误是一些代码(我已经编写了代码,所以这是我自己的错)。我无法理解的是为什么编译器没有发现它。

代码是用 C 编写的,我已经使用了很多年,我一直认为自己很了解,但这对我来说没有意义。我在 Visual Studio 和 Gnu C 编译器下都尝试过类似的代码,都接受了。

代码是:

enum TYPE_ENUMS {
    TEST_CASE = 1,
};

int main()
{
    int caseVal = 1;
    switch (caseVal) {
    TEST_CASE:
        printf("1\n");
    default:
        printf("Unknown Case %d\n", caseVal);
        break;
    }   
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释枚举如何成为 case 语句的一部分,而之前没有“case”。这应该是有效代码吗?如果是这样,它有什么用处吗?

dbu*_*ush 5

您拥有的实际上是一个可以作为语句目标的标签goto,并且没有任何限制说普通标签不能出现在switch块内。

标签位于与包含enum常量的普通标识符不同的命名空间中,因此它们可以无歧义地共存。这在C 标准的第 6.2.3p1 节中有详细说明:

如果在翻译单元中的任何一点都可以看到多个特定标识符的声明,则句法上下文会消除引用不同实体的用法的歧义。因此,各种类别的标识符都有单独的名称空间,如下所示:

  • 标签名称(通过标签声明和使用的语法消除歧义);
  • 结构、联合和枚举的标签(通过跟随任何关键字struct, union, 或 来消除歧义enum);
  • 结构或工会的成员;每个结构或联合都有一个单独的命名空间用于其成员(通过用于通过.or-> 运算符访问成员的表达式的类型来消除歧义);
  • 所有其他标识符,称为普通标识符(在普通声明中声明或作为枚举常量声明)。