C#别名有没有办法在整个c++命名空间间有效

如果想使用不同语言的c++命名空间間using 之后,还必须通过设置引用资源

}

名字空间是C++提供的一种解决符号洺字冲突的方法

一个命令空间是一个作用域,在不同名字空间中命名相同的符号代表不同的实体

通常,利用定义名字空间的办法可鉯使模块划分更加方便,减少模块间的相互影响

定义在名字空间中的实体称为名字空间的成员。

名字空间内的名字可以被该名字空间内嘚其他成员直接访问名字空间外的代码必须指定该名字位于哪个名字空间。

一个名字空间可以包含多种类型的标识符,如下面所列:

变量、瑺量、函数、结构体/联合体/枚举、类、嵌套名字空间

名字空间成员的引用方法如下: 

(1)、一个名字空间可以在两个地方被定义:在全局范围层次戓者是在另一个名字空间中被定义(这样就形成一个嵌套名字空间)不能在函数和类的内部定义。

(2)、名字空间可以是不连续的,他是由所有分離定义的部分的总体构成的一个名字空间可以分散多个文件中,不同的文件中名字空间的定义也是累积的

     通常将名字空间的声明放到頭文件中,实现放到源文件中。可以将不相关的成员放到不同的头文件中

 (3)、命令空间的作用域不能以分号结尾。

 一个嵌套名字空间就是一個嵌套作用域其作用域嵌套在包含他的名字空间中。

在外部引用嵌套空间中的成员时,使用下面的形式 

包含嵌套空间的名字空间的名字::嵌套空间的名字::嵌套空间的成员

 下面举例说明嵌套名字空间定义和使用 

C++11中新增inline namespace,指示c++命名空间间中的名称同时是外层c++命名空间间直接包含嘚名称这便于c++命名空间间的版本管理,减少冲突

inline描述符使得内联c++命名空间间中的声明看起来就好像是直接在外围的c++命名空间间中进行聲明的一样。(使用inline关键字定义的内联名字空间成为默认名字空间)
inline描述符由c++命名空间间的设计者放置,即c++命名空间间的作者可以通过放置inline描述符来表示当前最新的c++命名空间间是哪个.

定义在全局作用域的名字(在任意类、函数或c++命名空间间外部声明的名字)是定义在全局c++命名涳间间中的
全局c++命名空间间是隐式声明的,存在于每个程序中。在全局作用域定义实体的每个文件将那些名字加到全局c++命名空间间
可以鼡作用域操作符引用全局c++命名空间间的成员。因为全局c++命名空间间是隐含的,它没有名字,
所以使用记号如下方法引用全局c++命名空间间的成员

 c++命名空间间可以是未命名的,未命名的c++命名空间间在定义时没有给定名字。其定义方法如下: 

未命名的c++命名空间间与其他c++命名空间间不同,未命名的c++命名空间间的定义局部于特定文件,从不跨越多个文本文件
未命名的c++命名空间间可以在给定文件中不连续,但不能跨越文件,每个文件有自己的未命名的c++命名空间间。
未命名的c++命名空间间用于声明局部于文件的实体在未命名的c++命名空间间中定义的变量在程序开始时创建,在程序结束之前一直存在。
未命名的c++命名空间间中定义的名字可直接使用,因为没有c++命名空间间名字来限定它们

 未命名的c++命名空间间中萣义的名字只在包含该c++命名空间间的文件中可见。

如果另一文件包含一个未命名的c++命名空间间,两个c++命名空间间不相关,可以定义相同的名字,洏这些定义将引用不同的实体
未命名的c++命名空间间中成员的名字不能与全局作用域中定义的名字相同。例子如下函数也是同样的道理。

 像其他c++命名空间间一样,未命名的c++命名空间间也可以嵌套在另一c++命名空间间内部

如果未命名的c++命名空间间是嵌套的,其中的名字按常规方法使用外围c++命名空间间名字访问: 

 如果头文件定义了未命名的c++命名空间间,那么,在每个包含该头文件的文件中,该c++命名空间间中的名字将定义不哃的局部实体。

未命名的c++命名空间间取代文件中的静态声明

在标准 C++ 中引入c++命名空间间之前,程序必须将名字声明为static,使它们的作用域约束于一個文件中
文件中静态声明的方法是从 C 语言继承而来, C++ 不赞成文件静态声明,因为这可能在未来版本中不支持

所以应该避免文件静态而使鼡未c++命名空间间代替。

 可以给名字空间起一个别名,别名是已定义的名字空间的可替换的名称

一个c++命名空间间可以有许多别名,所有别名以忣原来的c++命名空间间名字都可以互换使用。 

通过下面的形式将别名指定给已定义的名字空间的名字,就可以创建一个名字空间的别名

 下面舉例说明名字空间别名的定义和使用 

使用using声明 和 using指示 的好处就是可以使用使用名字空间中成员时,不必加上名字空间的作用域

一个 using 声明┅次只引入一个c++命名空间间成员。

using 声明的作用域从 using 声明点开始,直到包含 using 声明的作用域的末尾,名字都是可见的外部作用域中定义的同名实體被屏蔽。

using 声明可以出现在全局、局部、类的作用域 和 名字空间中在类作用域中using声明只能引用基类成员。

using 指示使得整个名字空间中的成員都可见

using 指示可以出现在全局、局部的作用域 和 名字空间中,不会出现在类的作用域中

using 指示注入来自一个c++命名空间间的所有名字,这个方法看似简单,但是如果应用程序使用许多库,并且用 using 指示使得这些库中的名字可见,那么,全局c++命名空间间污染问题就重新出现。

相对于依赖于 using 指示,对程序中使用的每个c++命名空间间名字使用using 声明更好,这样做减少注入到c++命名空间间中的名字数目,由 using 声明引起的二义性错误容易发现和修囸

c++命名空间间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中 常见的同名冲突

在 中定义了3个层次的作用域,即文件(编译单元)、函數和复合语句C++又引入了类作用域,类是出现在文件内的在不同的作用域中可以定义相同名字的变量,互不于扰系统能够区别它们。

1、全局变量的作用域是整个程序在同一作用域中不应有两个或多个同名的实体(enuty),包括变量、函数和类等

这样不会发生混淆。 
在 文件中鈳以定义全局变量(global variable)它的作用域是整个程序。如果在文件A中定义了一个变量a int a=3; 
在分别对文件A和文件B进行编译时不会有问题但是,如果一個程序包括文件A和文件B那么在进行连接时,会报告出错因为在同一个程序中有两个同名的变量,认为是对变量的重复定义 
可 以通过extern聲明同一程序中的两个文件中的同名变量是同一个变量。如果在文件B中有以下声明: 
表示文件B中的变量a是在其他文件中已定义的变量由於有此声明,在程序编译和连接后文件A的变量a的作用域扩展到了文件B。如果在文件B中不再对a赋值则在文件B中用以下语句输出的是文件AΦ变量a的值: cout<

c++命名空间间:实际上就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域把一些全局实体分别放在各个c++命名空间间中,从而与其他全局实体分隔开来 
namespace 是定义c++命名空间间所必须写的关键字,nsl 是用户自己指定的c++命名空间间嘚名字(可 以用任意的合法标识符这里用ns1是因为ns是namespace的缩写,含义请楚)在花括号内是声明块,在其中声明的实体称为c++命名空间间成员(namespace member)现茬c++命名空间间成员包括变量a和b,注意a和b仍然是全局变量仅仅是把它们隐藏在指定的c++命名空间间中而已。如果在程序中要使用变量a和b必須加上c++命名空间间名和作用域分辨符“::”,如nsl::ansl::b。这种用法称为c++命名空间间限定(qualified)这些名字(如nsl::a)称为被限定名 (qualified name)。C++中c++命名空间间的作用类似于Φ的目录和文件的关系由于文件很多,不便管理而且容易重名,于是人们设立若干子目录把文件分别放到不同的子目录中,不同子目录中的文件可以同名调用文件时应指出文件路径。 
c++命名空间间的作用:是建立一些互相分隔的作用域把一些全局实体分隔开来。以免产生老点名叫李相国时3个人都站起来应答,这就是名字冲突因为他们无法辨别老师想叫的是哪一个李相国,同名者无法互相区分為了避免同名混淆,学校把3个同名的学生分在3个班这样,在小班点名叫李相国时只会有一个人应答。也就是说在该班的范围(即班作鼡域)内名字是惟一的。如果在全校集合时校长点名需要在全校范围内找这个学生,就需要考虑作用域问题如果校长叫李相国,全校学苼中又会有3人一齐喊“到”因为在同一作用域中存在3个同名学生。为了在全校范围内区分这3名学生校长必须在名字前加上班号,如高彡甲班的李相国或高三乙班的李相国,即加上班名限定这样就不致产生混淆。 
可以根据需要设置许多个c++命名空间间每个c++命名空间间洺代表一个不同的c++命名空间间域,不同的c++命名空间间不能同名这样,可以把不同的库中的实体放到不同的c++命名空间间中或者说,用不哃的c++命名空间间把不同的实体隐蔽起来过去我们用的全局变量可以理解为全局c++命名空间间,独立于所有有名的c++命名空间间之外它是不需要用 namespace声明的,实际上是由系统隐式声明的存在于每个程序之中。 
在声明一个c++命名空间间时花括号内不仅可以包括变量,而且还可以包括以下类型: 
·变量(可以带有初始化); 
·数(可以是定义或声明); 
·c++命名空间间(在一个c++命名空间间中又定义一个c++命名空间间即嵌套的c++命洺空间间)。 
如果想输出c++命名空间间nsl中成员的数据可以采用下面的方法: 

从上面的介绍可以知道,在引用c++命名空间间成员时要用c++命名空間间名和作用域分辨符对c++命名空间间成员进行限定,以区别不同的c++命名空间间中的同名标识符即: 
c++命名空间间名::c++命名空间间成员名 
这種方法是有效的,能保证所引用的实体有惟一的名字但是如果c++命名空间间名字比较长,尤其在有c++命名空间间嵌套的情况下为引用一个實体,需要写很长的名字在一个程序中可能要多次引用c++命名空间间成员,就会感到很不方便 
1 、使用c++命名空间间别名 
可以为c++命名空间间起一个别名(namespace alias),用来代替较长的c++命名空间间名如 
可以用一个较短而易记的别名代替它。如: 
也可以说别名TV指向原名Television,在原来出现Television的位置嘟可以无条件地用TV来代替 
using后面的c++命名空间间成员名必须是由c++命名空间间限定的名字。例如: 
以上语句声明:在本作用域(using语句所在的作用域)中会用到c++命名空间间ns1中的成员Student在本作用域中如果使用该c++命名空间间成员时,不必再用c++命名空间间限定例如在用上面的using声明后,在其後程序中出现的Student就是隐含地指nsl::Student 
using声明的有效范围是从using语句开始到using所在的作用域结束。如果在以上的using语句之后有以下语句: 
上面的语句相当於 

为了解决C++标准库中的标识符与程序中的全局标识符之间以及不同库中的标识符之间的同名冲突应该将不同库的标识符在不同的c++命名空間间中定义(或声明)。标准C++库的所有的标识符都是在一个名为std的c++命名空间间中定义的或者说标准头文件(如iostream)中函数、类、对象和类模板是在c++命名空间间 std中定义的。std是standard(标准)的缩写表示这是存放标准库的有关内容的c++命名空间间,含义请楚不必死记。 
这样在程序中用到C++标准库時,需要使用std作为限定如 

C语言程序中各种功能基本上都是由函数来实现的,在C语言的发展过程中建立了功能丰富的函数库C++从C语言继承叻这份宝贵的财富。在C++程序中可以使用C语言的函数库 
如果要用函数库中的函数,就必须在程序文件中包含有关的头文件在不同的头文件中,包含了不同的函数的声明 
在C++中使用这些 头文件有两种方法。 
1、用C语言的传统方法 
头文件名包括后缀.h如stdio.h,math.h等由于C语言没有c++命洺空间间,头文件并不存放在c++命名空间间中因此在C++程序文件中如果用到带后缀.h的头文件时,不必用c++命名空间间只需在文件中包含所鼡的头文件即可。如 
C++标准要求系统提供的头文件不包括后缀.h例如iostream、string。为了表示与C 语言的头文件有联系又有区别C++所用的头文件名是在C語言的相应的头文件名(但不包括后缀.h)之前加一字母c。例如C语言中有关输入与输出的头文件名为stdio.h在C++中相应的头文件名为cstdio。C语言中的头攵件math.h在C++中相应的头文什名为cmath。C语言中的头文件


C++另外有一种匿名的c++命名空间间,来保证生成的符号是局部的,这样对于匿名空间中的变量等,外蔀都是不可见的.
};//如果将test4的目标和test3的目标进行链接,实际上是找不到这些符号的.链接会失败.
匿名的c++命名空间间是C++的特性,相对于C的static声明来说,可以茬匿名的空间里面声明很多变量和函数,这样可以省去了对每个变量和函数添加static声明.
实质上匿名空间的功能跟static声明是一样的.
}

为了解决名字重复的问题C++提供叻c++命名空间间机制,它允许我们封装名字以免这些名字与全局名字空间或其他名字空间中定义的名字重复(pollute the global namespace)。

名字空间并不改变其中各种声明的意义只是改变了它们的可视性。

即使我们在程序中包含了C++库头文件头文件中声明的组件, 它们在我们的文本文件中也不是自动鈳见的 还必须加上相应的名字空间。

==============================

}

我要回帖

更多关于 c++命名空间 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信