为什么标准规定 C 中的结构、枚举和联合标签有三个可能的命名空间,而实际上只有一个?



在ISO/IEC 9899:2018(C18(中,6.2.3规定了"标识符的命名空间"(强调我的(:

6.2.3 标识符的命名空间

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

标签
  • 名称(通过标签声明和使用的语法消除歧义(;

  • 关键字结构、联合或枚举的结构、联合和枚举的标记(通过遵循 any32 消除歧义(;

  • 结构或联合
  • 的成员;每个结构或联合都有一个单独的成员名称空间(通过用于通过 . 或 -> 运算符访问成员的表达式类型消除歧义(;

  • 所有其他标识符,称为普通标识符(在普通声明符中声明或作为枚举常量声明(。


32( 标签只有一个命名空间,即使可能有三个

他们所说的">即使三个是可能的">是什么意思?这究竟是什么"可能"?


作为实验,我尝试编译以下代码:

#include <stdio.h>
int main()
{
struct foo{
int a;
double b;
float c;
};
enum foo{
Test1,Test2,Test3
};
union foo{
int x;
double y;
float z;
};
return 0;
}

我有以下错误:

错误:"foo"定义为错误的标记类型

对于两者,enumunion定义,就像你在这里看到的那样,它证明只为所有structenumunion标签提供了一个命名空间,就像标准描述的那样。但是另外两个"可能"的名称空间呢?

我的问题是:

  • 为什么标准规定 C 中的结构、枚举和联合标签有三个可能的命名空间,而实际上它们只有一个(在同一范围内(?

为什么我们不能使用三种可能的名称空间来标记结构、枚举和联合,尽管甚至标准都说它们应该存在?

该标准并没有说结构、联合和枚举存在单独的命名空间。它说理论上三个是可能的,这意味着该语言可能被设计为每个语言具有单独的命名空间。

该语言可能被设计为具有单独的命名空间,因为标签只出现在关键字structunionenum之后,所以编译器总是知道需要哪个命名空间。

尽管如此,C开发人员和C委员会决定不在语言设计中使用它。该标准的含义是有一个命名空间,其中包含结构、联合和枚举的所有标记。

最新更新