未命名名字空间

未命名的名字空间

我们或许希望所定义的对象、函数、类类型或其他实体,它只在程序的一小段代码中可见,因为这样可以更进一步地缓解名字空间污染问题,因为我们知道该实体只 被用在很有限的地方,所以可能不想再花费太多努力来保证这个实体有惟一的名字而不会与程序其他地方声明的名字冲突。当我们在一个函数或嵌套块中声明一个对 象时,由该声明引入的名字只在声明它的块中可见,但是,如果程序员想让一个实体被多个函数使用,而又不想让该名字在整个程序中可用 又该怎么办呢?

例如 假设我们想实现一组排序函数,对 double 型 vector 的元素进行排序:


1

2

3

4

5

// ----- SortLib.h -----

void quickSort( double *, double * );

void bubbleSort( double *, double * );

void mergeSort( double *, double * );

void heapSort( double *, double * );

所有函数都使用同一个 swap()函数来交换vector 中的元素,但是,我们不想让
swap()在整个程序中可见
我们希望保持该函数对于文件SortLib.C的局部性,因为只有上面四个函数调用swap()。下面的代码没有给我们预期的结果,你能看出为什么吗 ?


1

2

3

4

5

6

7

// ----- SortLib.C -----

void swap( double *d1, double *d2 ) { /* ... */ }

// 只有下面四个函数使用 swap()

void quickSort( double *d1, double *d2 ) { /* ... */ }

void bubbleSort( double *d1, double *d2 ) { /* ... */ }

void mergeSort( double *d1, double *d2 ) { /* ... */ }

void heapSort( double *d1, double *d2 ) { /* ... */ }

即使函数 swap()在 SortLib.C中定义,并且没有在描述排序库的接口的头文件SortLib.h中引入。但是,函数 swap()仍然是在全局域中声明的,因此它是一个全局实体,它的名字不能与任何其他全局实体的名字冲突  。

在C++中 我们可以用未命名的名字空间 unnamed namespace
声明一个局部于某一文件的实体 ,未命名的名字空间以关键字 namespace开头,同为该名字空间是没有名字的,所以在关键字
namespace后面没有名字,而在关键字 namespace后面使用花括号包含声明块


1

2

3

4

5

// ----- SortLib.C -----

namespace {

 void swap( double *d1, double *d2 ) { /* ... */ }

}

// 上面四个排序函数的定义

函数 swap()只在文件
SortLib.C中可见,如果另一个文件也含有一个带有函数swap()定义的未命名名字空间,则该定义引入的是一个不同的函数,函数
swap()存在两种定义但这并不是个错误,因为它们是不同的函数,不像其他名字空间,未命名的名字空间的定义局部于一个特定的文件,不能跨越多个文本文
件  。

在 SortLib.C中,在未命名的名字空间的定义之后,我们可以用 swap()的简短格式引用它,没有必要用域操作符引用未命名名字空间的成员 。


1

2

3

4

5

6

7

8

9

void quickSort( double *d1, double *d2 ) {

 // ...

 double* elem = d1;

 // ...

 // 引用未命名名字空间成员 swap()

 swap( d1, elem );

 

 // ...

}

由于未命名名字空间的成员是程序实体,所以函数 swap()可以在程序整个执行期间被调用,但是,未命名名字空间成员名只在特定的文件中可见 在构成程序的其他文件中是不可见的  。

在引入标准
C++名字空间之前,解决此类声明局部化问题的常见方案是使用从 C语言中继承来的关键字 static,未命名名字空间的成员与被声明为static
的全局实体具有类似的特性 。在 C中 被声明为static 的全局实体在声明它的文件之外是不可见的 ,例如 在
SortLib.C中的声明可以按如下形式写成 C程序,它会提供给 swap()相同的特性 。


1

2

3

4

// SortLib.C

// swap() 在其他程序中不可见

static void swap( double *d1, double *d2 ) { /* ... */ }

// sort 函数定义同前

许多 C++实现都支持全局静态声明,但是,随着越来越多的 C++实现都支持名字空间全局静态声明的用法将会被未命名的名字空间成员所取代。

时间: 2024-11-08 23:02:43

未命名名字空间的相关文章

C++名字空间详解

代码编译运行环境:VS2012+Win32+Debug 1.名字空间的由来 名字空间(namespace)是由标准C++引入的,是一种新的作用域级别.原来C++标识符的作用域分为三级:代码块({-}和函数体).类域和全局作用域.如今,在类作用域和全局作用域之间,C++标准又添加了名字空间域这一个作用域级别. 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突. 2.名字空间的作用 名字空间的作用主要是为了解决日益严重的名称冲突问题.随着可重用代码的增多,各种不同的

C++名字空间/C++命名空间

0.序言 名字空间是C++提供的一种解决符号名字冲突的方法. 一个命令空间是一个作用域,在不同名字空间中命名相同的符号代表不同的实体. 通常,利用定义名字空间的办法,可以使模块划分更加方便,减少模块间的相互影响. 1.名字空间的成员 定义在名字空间中的实体称为名字空间的成员. 名字空间内的名字可以被该名字空间内的其他成员直接访问,名字空间外的代码必须指定该名字位于哪个名字空间. 一个名字空间可以包含多种类型的标识符,如下面所列: 变量.常量.函数.结构体/联合体/枚举.类.嵌套名字空间 名字空间

The filename 未命名.ipa in the package contains an invalid character(s).

The filename 未命名.ipa in the package contains an invalid character(s).  The valid characters are: A-Z, a-z, 0-9, dash, period, underscore, but the name cannot start with a dash, period, or underscore 把ipa的名字换成中文就OK了,就这么简单.

2016-3-21未命名文件

2016-3-21未命名文件 新建 模板 小书匠 欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过设置里的修改模板来改变新建文章的内容. fsf[1] haha sfdsf sdf `dsfsf afdsf sfsfsfsfsz这只是一个测试fs 苹果的定义 它是水果也是电子产品,看你怎么去想了 很多的东西都是这样,你不去说的话,没有人会要你的生活 但是就这么远 还有一样,就是我们不去 地方上面综合司有一些看法,但是放弃的都放弃,回不来的就让他去吧.就像你曾今说的那样,何必去最去.

c++新增的名字空间namespace

其实c也有此名字空间的概念 防止命名冲突,尤其是大型程序里很有用,节省精力,以免出错.可以全部引进,可以引进部分,还可以一个都不用.无所谓. using namespace std;  //标准库的名字都放在std里面 1 #include <iostream> 2 #include <string> 3 using namespace std;//标准库里的东西都可以用了.一劳永逸的方法 4 int main() 5 { 6 cout << "请输入姓名:&

C++笔记--名字空间和异常

名字空间 成员函数可以在名字空间的定义里去声明,然后再去采用一种定义方式例如:namespace__name::member_name的方式去定义这个成员函数 1 namespace parser{ 2 double prim(bool); 3 double term(bool); 4 } 5 6 double parser::prim(bool get){/*定义*/} 7 double parser::term(bool get){/*定义,这些定义式定义在命名空间之外的*/} 名字空间中的

C++ 类的引入,名字空间的意义

有一天,公司来了新人,我要对他的一些属性做些基本的记录.比如,我得知道他的姓名,年龄等.那么通过编程来记录他的这些属性,很明显,我得有一个保存姓名的数组,保存年龄的数组,但是随着记录越来越完善,那么我就得不断的添加数组,如果人不多还好,但是一旦人多了起来之后,每来一个人,都要重开一边数组记录他的基本信息,首先这样代码会变得又烂又长,而且,不便于开发者管理及开发程序.所以,为了解决这种具有同一属性的数据,我们将它们的同一属性封装成一种类型,这种类型在C语言中称为结构体. 当有了这种类型之后,我可以

C++匿名名字空间

转自:http://blog.csdn.net/eric_arrow/article/details/8978905 名字空间(namespace),是C++提供的一个解决符合名字冲突的特性.标准规定,在不同名字空间中命名相同的符号,代表不同的实体.通常,利用定义名字空间的办法,可以使模块划分更加方便,减少模块间的相互影响. 通常定义一个名为MyNameSpace的名字空间,其形式为: 1namespace MyNameSpace 2{ 3} 如果不写MyNameSpace,在C++里也是允许的

ISO/IEC 9899:2011 条款6.2.3——标识符的名字空间

6.2.3 标识符的名字空间 1.如果一个特定标识符的多个声明在一个翻译单元的任意一点可见,那么语法上下文会区分对不同实体的引用.从而,对于标识符各种不同的类别具有独立的名字空间: ——标签名(通过标签声明和使用的语法进行区分): ——结构体.联合体以及枚举的类型名(通过关键字struct.union或enum进行区分): ——结构体或联合体的成员:每个结构体或联合体为其成员具有一个独立的名字空间(通过用于访问成员的.或是->操作符的表达式类型进行区分): ——所有其它标识符称为普通标识符(声明