前言
C++标准提供了名称空间工具,以便更好地控制名称的作用域。
namespace
通过定义一种新的声明区域来创建名称的名称空间,这样做的目的之一是提供一个声明名称的区域。 一个名称空间中的名称不会与另外一个名称空间的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。
示例:
namespace Base
{
int a;
void fun();
struct Object {};
}
名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。
若要访问名称空间中的名称,最简单的方法是通过作用域解析运算符::。
示例:
Base::a = 1;
Base::fun();
Base::Object obj;
using声明和using编译指令
- using声明使特定的标识符可用
- using编译指令使整个名称空间可用
using声明: 由关键字 using 和 被限定的名称 组成。示例:
using Base::a;
using编译指令由关键字 using namespace 和后面的名称空间组成。示例:
using namespace Base;
using namespace std;
注意
假设名称空间和声明区域定义了相同的名称。如果试图使用using声明将名称空间的名称导入该声明区域,则这两个名称会发生冲突,导致出错。 如果使用using编译指令将该名称空间的名称导入到该声明区域,则局部版本将隐藏名称空间版本。
一般来说,使用using声明更加安全,因为只会导入指定名称,如果发生冲突,编译器会提示。
名称空间其他特性
- 可以将名称空间进行嵌套
namespace Base
{
namespace Object
{
int a;
}
int b;
}
若要使用其中的变量a,则需要这样表示:
using Base::Object::a;
using namespace Base::Object;
- 可以在名称空间中使用using编译指令和using声明:
namespace Jack
{
using Base::b;
using namespace std;
}
- 可使用无名的名称空间
namespace
{
int a;
int b;
}
声明的名称潜在作用域为:从声明点到该声明区域末尾。
因为美有名称,所以不能显式的使用using来使它在其他位置都可用。具体的说:不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间的名称。这提供了链接性为内部的静态变量的替代品。
即:
static int count;
namespace
{
int count;
}
|