【发布时间】:2011-07-13 16:09:45
【问题描述】:
C 规范说
有四种作用域:函数、文件、块和函数原型。
现在,如果我在任何函数之外执行以下操作
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的函数作用域”->“文件作用域”。
我曾经和一位 C 编译器作者交谈过,他说x 不在任何范围内。谁能解释一下这将如何工作?那么我们怎么能以任何方式引用x呢?进一步引用(强调我的):
标识符可以表示一个对象;一个函数;标记或结构的成员、联合或枚举;类型定义名称;标签名称;宏名;或宏参数。
同一个标识符可以在程序的不同点表示不同的实体。
对于标识符指定的每个不同实体,标识符仅在称为其范围的程序文本区域内可见(即可以使用)。
如果我们说结构的成员没有范围,那么它是不可见的,因此不能使用。但显然,我们可以使用结构成员。我错过了什么吗?
【问题讨论】:
标签: c namespaces scope