命名空间
C++中的命名空间
在C++语言中,命名空间是一种实体(entity),使用namespace来声明,并使用{ }来界定命名空间体(namespace body)。
例:
namespacefoo{intbar;}
和C语言的全局作用域兼容,C++具有全局命名空间作用域,对应的命名空间是全局命名空间。全局命名空间不需要声明。使用时,可以用前缀为::的qualified-id显式限定全局命名空间作用域中的名称。例如,::operator new指称全局new运算符函数。
命名空间可以在另一命名空间之中嵌套声明;但不能声明在类和代码块之中。在命名空间中声明的名称,默认具有外部链接属性(除非声明的是const对象,它默认是具有内部链接属性)。
按照是否有名字,可分为有名字的命名空间与匿名命名空间。后者的声明为:
namespace{namespace-body(即声明序列(可选))}
匿名命名空间中的名字具有文件作用域。这些名字在本编译单元中可以直接使用;也可以用前缀为::的qualified-id显式限定后使用。匿名命名空间中的名字具有内部链接属性。
命名空间的成员,是在命名空间体的花括号内声明了的名称。可以在命名空间体之外,给出命名空间成员的定义。即命名空间的成员声明与定义可以分开。命名空间内的名字,只能有一次定义,但可以多次声明。
嵌套的子命名空间必须定义在上层命名空间体之内。禁止把子命名空间的声明与定义分开。
不能以“命名空间名::成员名;”方式,在命名空间体之外为命名空间添加新成员。必须在命名空间体之中添加新成员的声明。
可以多次声明和定义同一命名空间,每次给这一命名空间添加新成员。同名的命名空间即便在声明位置不同,仍然是同一个实体。
可以在一个命名空间中引入其他命名空间的成员。例如:
namespacemyNameSpace{usingnamespaceHis_NameSpace;usingOLib::List;voidmy_func(String&,List&);}
引用命名空间的成员,有下述办法:
使用命名空间的作用域解析运算符::,如:std::cout
using namespace 命名空间名[::命名空间名…];该语句使指定的命名空间中的目前已经生命的名字都提升到当前语句所在的作用域中可直接使用。如果引入的名字与该语句所在的声明区域的名字发生冲突,则编译器并不会发出任何警告信息,而只是用声明区域中的名字自动隐藏(hiding)命名空间中的同名成员,即使using namespace更靠后也是如此。
using 命名空间名::[命名空间名::……]成员名; 引入命名空间中的一个成员。如果引入的名称与局部名称发生同名冲突,编译器会报错。
命名空间可以有别名:namespace 别名 = 命名空间名; 这使得名字较长的命名空间可以方便地用较短的别名来引用。
C++11起支持内联命名空间。使用inline namespace作为声明的起始。内联命名空间的名称在名称查找时被特别对待,使用qualified-id引用其中的名称时,被内联的命名空间名称可以省略。也即,内联命名空间内的标识符被提升到包含着内联的命名空间的那个父级的命名空间中。内联命名空间可以在修改命名空间名称的同时避免在二进制文件中生成的符号改变,因此不同内联命名空间的名称可以用于标识接口兼容的不同版本,有助于保持二进制兼容性。这也在标准库的实现中被使用,如libstdc++和libc++。
namespaceContoso{namespacev_10{templateclassFuncs{public:Funcs(void);TAdd(Ta,Tb);TSubtract(Ta,Tb);TMultiply(Ta,Tb);TDivide(Ta,Tb);};}inlinenamespacev_20{templateclassFuncs{public:Funcs(void);TAdd(Ta,Tb);TSubtract(Ta,Tb);TMultiply(Ta,Tb);std::vectorLog(double);TAccumulate(std::vectornums);};}}
在XML中的应用
XML虽然不是一个独立的编程语言,但是它的出现使得命名空间的使用变得更为广泛。
在同一个命名空间里,所有的元素名都必须唯一。
声明一个命名空间使用XML保留的属性xmlns,它的值必须是URI(统一资源标志符 Uniform Resource Identifier而非URL--Universal Resource Locator)指代.比如xmlns="".注意,事实上URI是不可读的,但它对XML解析器来说就只是简单不过的字符串.比如,/这个地址本身并不包含任何代码,它只表示XHTML命名空间.使用URI (比如"")去标示一个命名空间,而不是用一个简短的字符串 (比如"xhtml"),这样做是为了减少不同命名空间标示符冲突的可能性.
命名空间的模拟
参见
作用域
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值