C++名字空间/C++命名空间(二)
套在另一命名空间内部。
如果未命名的命名空间是嵌套的,其中的名字按常规方法使用外围命名空间名字访问:
复制代码
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++ 不赞成文件静态声明,因为这可能在未来版本中不支持。
匿名名字空间提供了类似在全局函数前加 static 修饰带来的限制作用域的功能。
它的这种特性可以被用在struct和class上, 而static却不能不能修饰class和struct这样的结构定义。
所以应该避免文件静态而使用未命名空间代替。
6、名字空间的别名
可以给名字空间起一个别名,别名是已定义的名字空间的可替换的名称。
一个命名空间可以有许多别名,所有别名以及原来的命名空间名字都可以互换使用。
通过下面的形式将别名指定给已定义的名字空间的名字,就可以创建一个名字空间的别名。
namespace 别名 = 已定义的名字空间名字;
下面举例说明名字空间别名的定义和使用
复制代码
#include
namespace MyNames
{
int iVal1 = 100;
int iVal2 = 200;
}
namespace MyAlias = MyNames; //别名定义
int main(void)
{
std::cout<
std::cout<
return 0;
}
复制代码
7、using声明 和 using指示
使用using声明 和 using指示 的好处就是可以使用使用名字空间中成员时,不必加上名字空间的作用域。
using std::cout; //using声明
using namespace std; //using指示
7.1、using声明(using declaration)
一个 using 声明一次只引入一个命名空间成员。
using 声明的作用域从 using 声明点开始,直到包含 using 声明的作用域的末尾,名字都是可见的。外部作用域中定义的同名实体被屏蔽。
using 声明可以出现在全局、局部、类的作用域 和 名字空间中。在类作用域中using声明只能引用基类成员。
复制代码
//using declaration in Global Scope
#include
using std::cout; //using声明
using std::endl; //using声明
int main(void)
{
cout<<"Hello World"<
return 0;
}
复制代码
复制代码
//using declaration in Local Scope
#include
void func(void)
{
using std::cout;
using std::endl;
cout << "Using Declarations In Function"<
}
int main()
{
func();
// cout << "Hello" <
return 0;
}
复制代码
复制代码
//using declaration in Class Scope
#include
class B
{
public:
void f(void) {printf("In B::f()\n");}
void g(void) {printf("In B::g()\n");}
};
class C
{
public:
void g() {printf("In C::g()\n");};
};
class D : public B
{
public:
using B::f; // OK: B is a base of D2
using B::g; // OK: B is a base of D2
// using C::g; // error: C isn't a base of D2
};
int main(void)
{
D MyD;
MyD.f();
MyD.g();
}
复制代码
复制代码
//using declaration in Namespce
#include
namespace MyNames
{
using std::string;
using std::cout;
using std::endl;
string str;
void func(void){cout << "Hello"<
}
int main(void)
{
MyNames::func();
return 0;
}
复制代码
7.2、using指示(using directive)
using 指示使得整个名字空间中的成员都可见。
using 指示可以出现在全局、局部的作用域 和 名字空间中,不会出现在类的作用域中。
复制代码
//using directive in Global Scope
#include
using namespace std; //using指示
int main(void)
{
cout<<"Hello World"<
return 0;
}
复制代码
复制代码
//using directive in Local Scope
#include
void func(void)
{
using namespace std;