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成员.我错过了什么吗?