3.2、内联嵌套名字空间(Inline Namespace C++11)
C++11中,新增inline namespace,指示命名空间中的名称同时是外层命名空间直接包含的名称。这便于命名空间的版本管理,减少冲突。
inline描述符使得内联命名空间中的声明看起来就好像是直接在外围的命名空间中进行声明的一样。(使用inline关键字定义的内联名字空间成为默认名字空间。)
inline描述符由命名空间的设计者放置,即命名空间的作者可以通过放置inline描述符来表示当前最新的命名空间是哪个.
// file V98.hpp: namespace V98 { void f(int); // does something // ... } // file V99.hpp: inline namespace V99 { void f(int); // does something better than the V98 version void f(double); // new feature // ... } // file Mine.hpp: namespace Mine { #include "V99.hpp" #include "V98.hpp" } //file example.cpp #include "Mine.hpp" using namespace Mine; // ... V98::f(1); // old version V99::f(1); // new version f(1); //default version |
4、全局名字空间(Global Namespce)
定义在全局作用域的名字(在任意类、函数或命名空间外部声明的名字)是定义在全局命名空间中的。
全局命名空间是隐式声明的,存在于每个程序中。在全局作用域定义实体的每个文件将那些名字加到全局命名空间。
可以用作用域操作符引用全局命名空间的成员。因为全局命名空间是隐含的,它没有名字,
所以使用记号如下方法引用全局命名空间的成员。
::member_name
5、匿名名字空间(Unnamed Namespace)
命名空间可以是未命名的,未命名的命名空间在定义时没有给定名字。其定义方法如下:
namespace //No name
{
//members....
}
未命名的命名空间与其他命名空间不同,未命名的命名空间的定义局部于特定文件,从不跨越多个文本文件。
未命名的命名空间可以在给定文件中不连续,但不能跨越文件,每个文件有自己的未命名的命名空间。
未命名的命名空间用于声明局部于文件的实体。在未命名的命名空间中定义的变量在程序开始时创建,在程序结束之前一直存在。
未命名的命名空间中定义的名字可直接使用,因为没有命名空间名字来限定它们。
#include <iostream> namespace //unnamed namespace { int count = 1; } using namespace std; namespace //unnamed namespace { void name_printf(void) { cout << "count = " << count << endl; } } int main(void) { count = 3; //直接使用 name_printf(); //直接使用 return 0; } |
未命名的命名空间中定义的名字只在包含该命名空间的文件中可见。
如果另一文件包含一个未命名的命名空间,两个命名空间不相关,可以定义相同的名字,而这些定义将引用不同的实体。
未命名的命名空间中成员的名字不能与全局作用域中定义的名字相同。例子如下,函数也是同样的道理。
int i; // global variable
namespace //unnamed namespace
{
int i;
}
// error: reference to ‘i’ is ambiguous
像其他命名空间一样,未命名的命名空间也可以嵌套在另一命名空间内部。
如果未命名的命名空间是嵌套的,其中的名字按常规方法使用外围命名空间名字访问:
int i; //Global Variable
namespace local
{
namespace //unnamed namespace
{
int i; // ok: i defined in a nested unnamed namespace is distinct from global i
}
}
local::i = 42;
如果头文件定义了未命名的命名空间,那么,在每个包含该头文件的文件中,该命名空间中的名字将定义不同的局部实体。
未命名的命名空间取代文件中的静态声明
在标准 C++ 中引入命名空间之前,程序必须将名字声明为static,使它们的作用域约束于一个文件中。
文件中静态声明的方法是从 C 语言继承而来, C++ 不赞成文件静态声明,因为这可能在未来版本中不支持。
所以应该避免文件静态而使用未命名空间代替。
6、名字空间的别名
可以给名字空间起一个别名,别名是已定义的名字空间的可替换的名称。
一个命名空间可以有许多别名,所有别名以及原来的命名空间名字都可以互换使用。
通过下面的形式将别名指定给已定义的名字空间的名字,就可以创建一个名字空间的别名。
namespace 别名 = 已定义的名字空间名字;
下面举例说明名字空间别名的定义和使用
#include <iostream> namespace MyNames { int iVal1 = 100; int iVal2 = 200; } namespace MyAlias = MyNames; //别名定义 int main(void) { std::cout<<MyAlias::iVal1<<std::endl; //别名使用 std::cout<<MyAlias::iVal2<<std::endl; //别名使用 return 0; } |