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

Joh*_*itb 6 c scope namespaces

C规范说

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

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

struct A {
  int x;
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

struct A {
  int x;
};

void f(void) {
  int i;
}
Run Code Online (Sandbox Code Playgroud)

然后参与此程序表示的标识符,作用域和名称空间(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
          |            |        |
Run Code Online (Sandbox Code Playgroud)

范围层次结构是"块范围#1" - >"f的功能范围" - >"文件范围".

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

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

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

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

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

Fre*_*Foo 5

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

也许编译器作家是迂腐的; 一个命名空间是不一样的一个范围.一个struct定义并不引入作用域,因为它不保持变量; 它拥有成员.