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”。这应该是有效代码吗?如果是这样,它有什么用处吗?
您拥有的实际上是一个可以作为语句目标的标签goto,并且没有任何限制说普通标签不能出现在switch块内。
标签位于与包含enum常量的普通标识符不同的命名空间中,因此它们可以无歧义地共存。这在C 标准的第 6.2.3p1 节中有详细说明:
如果在翻译单元中的任何一点都可以看到多个特定标识符的声明,则句法上下文会消除引用不同实体的用法的歧义。因此,各种类别的标识符都有单独的名称空间,如下所示:
- 标签名称(通过标签声明和使用的语法消除歧义);
- 结构、联合和枚举的标签(通过跟随任何关键字
struct,union, 或 来消除歧义enum);- 结构或工会的成员;每个结构或联合都有一个单独的命名空间用于其成员(通过用于通过
.or->运算符访问成员的表达式的类型来消除歧义);- 所有其他标识符,称为普通标识符(在普通声明符中声明或作为枚举常量声明)。