结构成员标识符放在什么范围内?
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类型。
x
在struct A
创建的范围内,但A
在全局范围内。 这就是“规范”调用文件范围,但名称具有误导性,因为您包含的所有文件都共享该范围。
范围和名称空间是两个完全不同的概念,不应混淆。
结构或联合的实例具有范围,但单个成员名称不具有范围; 范围的概念根本不适用于它们。
唉,我在考虑范围而不是范围。