namespace的作用
最初使用namespace是初学c++时,常在头文件处加上using namespace std; std就是包含c++标准库函数、对象名的命名空间,譬如cout,想使用这个函数名,可以有以下三种方式,一般还是推荐使用第三种方式。
1.using namespace std;//using指示
2.using std::cout; //using声明
3.std::cout<<" "<<std::endl;
至于为什么要搞一个命名空间关键字,就是通常在写项目时,会定义一些全局变量、类、模板,写小的程序当然无所谓,但当做大的项目时,如果发生重名又没加以区分,就会出现问题,这也叫命名空间污染(namespace pollution)。
因此将命名的对象放在一个空间中,想使用它就使用<空间名>::作用域运算符调用,慎重使用using指示,使用using 指示会将所有命名全部注入,就起不到区分作用了。
使用方法
一般用法
namespace namespace_ {
// reference: http://en.cppreference.com/w/cpp/language/namespace
namespace A {
int x;
}
namespace B {
int i;
struct g { };
struct x { };
void f(int) { fprintf(stdout, "%s, %d\n", __FUNCTION__, __LINE__); };
void f(double) { fprintf(stdout, "%s, %d\n", __FUNCTION__, __LINE__); };
void g(char) { fprintf(stdout, "%s, %d\n", __FUNCTION__, __LINE__); }; // OK: function name g hides struct g
}
int test_namespace_1()
{
int i;
//using B::i; // error: i declared twice
void f(char);
using B::f; // OK: f(char), f(int), f(double) are overloads
f(3.5); // calls B::f(double)
using B::g;
g('a'); // calls B::g(char)
struct g g1; // declares g1 to have type struct B::g
using B::x;
using A::x; // OK: hides struct B::x
x = 99; // assigns to A::x
struct x x1; // declares x1 to have type struct B::x
return 0;
}
未命名的命名空间(unnamed namespace)
是指关键字namespace后紧跟花括号括起来的一系列声明语句。未命名的命名空间中定义的变量拥有静态生命周期:它们在第一次使用前创建,并且直到程序结束才销毁。定义了无名称命名空间的文件都可以直接调用这里面的变量,但其他文件则不行,类似于静态全局变量,未命名的命名空间也正是为了取代静态声明。
namespace{
int sum(int a,int b);
}
关于无命名空间,需要注意如下两点:
1、无名名字空间主要是保持代码的局部性
2、在C++编译器实现时,无名名字空间其实是有名字的,这个隐含的名字跟它所在编译单元名字相关。所以基于这一点,我们不能跨编译单元使用无名名字空间中的名字
嵌套命名空间
namespace first_space {
void func() {
std::cout << "Inside first_space" << std::endl;
}
// second name space
namespace second_space {
void func() {
std::cout << "Inside second_space" << std::endl;
}
}
}
int test_namespace_5()
{
using namespace first_space::second_space;
// This calls function from second name space.
func();
return 0;
}
如果嵌套的是未命名的namespace,调用父namespace,也可以使用嵌套的未命名namespace。