在C++中 我们可以用未命名的名字空间 unnamed namespace 声明一个局部于某一文件的实体,未命名的名字空间以关键字 namespace开头,同为该名字空间是没有名字的,所以在关键字namespace后面没有名字,而在关键字namespace后面使用花括号包含声明块
?12345 | // ----- SortLib.C ----- namespace {
void swap( double *d1, double *d2) { } } |
函数swap()只在文件SortLib.C中可见,如果另一个文件也含有一个带有函数swap()定义的未命名名字空间,则该定义引入的是一个不同的函数,函数swap()存在两种定义但这并不是个错误,因为它们是不同的函数,不像其他名字空间,未命名的名字空间的定义局部于一个特定的文件,不能跨越多个文本文件。
在 SortLib.C中,在未命名的名字空间的定义之后,我们可以用swap()的简短格式引用它,没有必要用域操作符引用未命名名字空间的成员 。
?123456789 | void quickSort( double *d1, double *d2) {
//...
double *elem = d1;
//...
//引用未命名名字空间成员 swap()
swap(d1, elem );
//... } |
由于未命名名字空间的成员是程序实体,所以函数 swap()可以在程序整个执行期间被调用,但是,未命名名字空间成员名只在特定的文件中可见在构成程序的其他文件中是不可见的 。
在引入标准C++名字空间之前,解决此类声明局部化问题的常见方案是使用从 C语言中继承来的关键字static,未命名名字空间的成员与被声明为static 的全局实体具有类似的特性 。在 C中 被声明为static的全局实体在声明它的文件之外是不可见的 ,例如 在 SortLib.C中的声明可以按如下形式写成 C程序,它会提供给swap()相同的特性 。
?1234 | // SortLib.C // swap() 在其他程序中不可见 static void swap( double *d1, double *d2) { } // sort 函数定义同前 |
许多 C++实现都支持全局静态声明,但是,随着越来越多的C++实现都支持名字空间全局静态声明的用法将会被未命名的名字空间成员所取代。