版权归原作者所有,如有侵权,请联系我们

[科普中国]-声明区域

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

声明将名称引入到程序中,例如变量、命名空间、函数和类的名称。声明还指定了类型信息以及正在声明的对象的其他特征。C++语言中,名字的声明区域(declarative region),是指一个名字在程序文本中可能有效的最大的区域,在这个区域中,未受限定的该名字绑定到同一个实体。

简介名称的声明区域是它可能保持有效的最大的程序结构,即名称在单个程序中起作用的最大范围,可以是在程序文本的区域没有两个实体被允许具有相同的名称。在方法的上下文中表征声明空间的一种方法是说“类中具有相同名称的所有重载方法的集合”构成“实体”。表征方法的另一种方法是调整声明空间的定义,以表示除了一组方法之外,不允许两个事物具有相同的名称,这些方法在签名方面都不相同。声明区域类型有很多如整个编译单元、整个名字空间、一对花括号{与}括起来的整个语句块、整个函数体(甚至包括函数的形参列表)、类定义(包括成员函数的定义)等等。例如:

int j = 24;int main() { int i = j, j; j = 42; }名字j被声明了两次并被使用了两次。第一个被声明的j的声明区域是整个例子程序。第一个j的潜在作用域(potential scope)在这个名字被声明处之后,并持续至程序的末尾。但第一个j的(实际)作用域应排除逗号,与右花括号}之间的程序区域。第二个被声明的j(在分号之前的那个j)的声明区域是一对花括号{与}括起来的整个程序区域(也即main函数的函数体),但第二个j的潜在作用域应排除名字i的声明。第2个j的(实际)作用域与它的潜在作用域相同。

范围只能在程序的某些区域内使用C++ 名称。此区域称为名称的“范围”。范围决定一个不表示静态范围的对象的名称的“生存期”。在以下情况下,范围还可决定名称的可见性:调用类构造函数或析构函数时,或初始化范围的局部变量时。有五种范围:局部范围:块中声明的名称仅在该块中以及由它封闭的块中是可访问的,并且仅在声明点后可访问。函数范围:标签是具有函数范围的名称。它们可以在函数内的任意位置使用,但在函数外部是不可访问的。文件范围:在所有模块或类的外部声明的任何名称都具有文件范围。类范围:类成员的名称具有类范围。原型范围:函数原型中声明的名称仅在原型的末尾可见。范围与声明区域最大区别是:范围在程序文本的区域中,它是合法的,指的是实体通过其不合格的名称。程序文本的区域没有两个实体被允许具有相同的名称。例如,在文本区域中,除了M的主体之外,C 的主体不允许包含任何其他名称为x 的文本。一旦你有一个叫做x的字段,你就不能拥有另一个字段,属性,嵌套类型或者叫做x的事件。

类型命名空间(Namespace),也称名字空间、名称空间等,它表示着一个标识符(identifier)的可见范围(在C++中,将声明与定义组合到一个通用声明区域,称为命名空间)1。一个标识符可在多个名字空间中定义,它在不同名字空间中的含义是互不相干的。这样,在一个新的名字空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他名字空间中。

这一特点是使用名字空间的主要理由。在大型的计算机程序或文档中,往往会出现数百或数千个标识符。名字空间(或类似的方法,见“名字空间的模拟”一节)提供一隐藏区域标识符的机制。通过将逻辑上相关的标识符组织成相应的名字空间,可使整个系统更加模块化。

在编程语言中,名字空间是对作用域的一种特殊的抽象,它包含了处于该作用域内的标识符,且本身也用一个标识符来表示,这样便将一系列在逻辑上相关的标识符用一个标识符组织了起来。许多现代编程语言都支持名字空间。在一些编程语言(例如C++和Python)中,名字空间本身的标识符也属于一个外层的名字空间,也即名字空间可以嵌套,构成一个名字空间树,树根则是无名的全局名字空间。函数和类的作用域可被视作隐式名字空间,它们和可见性、可访问性和对象生命周期不可分区的联系在一起。

编译单元,指的是代码的物理组织形式。根据C++标准,每一个cpp 文件就是一个编译单元。

函数体是编程语言中定义一个函数功能的所有代码组成的整体。函数体是用花括号括起来的若干语句,他们完成了一个函数的具体功能。函数体内的前面是定义和说明部分,后面是语句部分。函数声明与函数体放在一起组成了函数定义。

作用域作用域(scope)是名字(name)与实体(entity)的绑定(binding)保持有效的那部分计算机程序。显然,这种名字绑定既可以是在编译时的静态绑定,也可使程序运行时的动态绑定,所产生的作用域分别称为静态作用域与动态作用域。C/C++是典型的静态绑定的作用域;而Emacs Lisp是典型的动态绑定的作用域。C++语言标准规定:使得特定名字保持有效的那些可能并不连续的程序文本就是该名字的作用域。名字的作用域通常从其声明之处开始,但要排除内部嵌套的声明区域中其他同名的名字的作用域

本词条内容贡献者为:

李岳阳 - 副教授 - 江南大学