namespace命名空间的使用

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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值