结构成员标识符放在什么范围内?

C规范说

范围有四种:函数,文件,块和函数原型。

现在,如果我在任何function之外执行以下操作

struct A { int x; }; 

我的理解是标识符x在文件范围内可见。 我们使用命名空间语法来访问该成员,正如规范所述

每个结构或联合为其成员都有一个单独的名称空间(通过。或 – >运算符用于访问该成员的表达式的类型消除歧义)

让我们通过添加一个函数来使它更清晰

 struct A { int x; }; void f(void) { int i; } 

然后参与此程序表示的标识符,范围和名称空间(N / A“不适用”):

 file scope ========================================== Ordinary | Members A | Tags | Labels ------------------------------------------ f | x | A | N/A | | | function scope of f ========================================= Ordinary | Members ? | Tags | Labels ----------------------------------------- N/A | N/A | N/A | | | | block scope #1 ========================================= Ordinary | Members ? | Tags | Labels ----------------------------------------- i | | | N/A | | | 

范围层次结构是“块范围#1” – >“f的function范围” – >“文件范围”。

我曾经与C编译器编写器谈过,他说x不在任何范围内。 任何人都可以解释这是如何工作的? 那么我们怎么能以任何方式引用x呢? 进一步引用(强调我的):

标识符可以表示对象; function; 标签或结构 ,联合或枚举的成员; 一个typedef名称; 标签名称; 宏名; 或宏参数。

相同的标识符可以表示程序中不同点的不同实体。

对于标识符指定的每个不同实体,标识符仅在称为其范围的程序文本的区域内可见(即,可以使用)。

如果我们说结构的成员没有范围,那么它是不可见的,因此不能使用。 但显然,我们可以使用struct成员。 我错过了什么吗?

正如标准所说,它位于为struct类型创建的单独名称空间中。 我认为这个规则是在C89中添加的。 曾几何时 ,所有成员名称共享一个名称空间。

也许编译器作家是迂腐的; 名称空间范围不同struct定义不引入范围,因为它不包含变量; 它拥有成员。

我认为在这种情况下它引用的范围是A.你通过SomeA.x引用成员,其中SomeA是A类型。

xstruct A创建的范围内,但A在全局范围内。 这就是“规范”调用文件范围,但名称具有误导性,因为您包含的所有文件都共享该范围。

范围名称空间是两个完全不同的概念,不应混淆。

结构或联合的实例具有范围,但单个成员名称不具有范围; 范围的概念根本不适用于它们。

唉,我在考虑范围而不是范围。