C++命名空间详解

1.什么是命名空间

在c++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突性的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入关键字namespace(命名空间/名字空间/名称空间),可以更好地控制标识符的作用域。

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
2.命名空间的使用

比如:

//定义命名空间,且只能在全局范围内定义
namespace sss
{
	int a = 10;
	float b = 20.0;
	char d = 's';
	//命名空间可以嵌套
	namespace ssst
	{
		struct stu
		{
			char name;
			char age;
			char sex;
			char grades;
		};
		int Fun(int a)
		{
			
			return ((a & 0xaaaaaa) << 1) + ((a & 0x555555) >> +1);
		}
	}
}//记住,这里与结构体不同,没有";"
int main()
{
	int a = 10;
	std::cout << sss::a << std::endl;//std标准库未展开
	std::cout << sss::b << std::endl;
	std::cout << sss::d << std::endl;
	std::cout << sss::ssst::Fun(a) << std::endl;
	return 0;
}

如果命名空间名字相同,则这两个命名空间将会被合并。且命名空间只能在全局范围内定义,命名空间可以嵌套。

3.命名空间的展开

这里以std标准库为列

//using namespace std;//全部展开,即std标准库里面的所用东西被展开到全局域中,成为全局变量,不推荐
using std::cin;//半展,即只展开经常用的
int main()
{
	int a = 10;
	//cout << a << endl;//全展
	cin >> a;//半展
	cout << a << endl;//没有展开的无法使用

	return 0;
}

4.作用域的使用

  1. 加命名空间名称及作用域限定符
  2. 使用using将命名空间中某个成员引入
  3. 使用using namespace 命名空间名称 引入
  • 第一种对应没有展开的,需要使用作用域限定符“::”
  • 第二种为部分展开的
  • 第三种为全部展开的,不推荐使用

最后还有个小知识,无名命名空间

  • 无名命名空间,意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识符加上了static,使得其可以作为内部连接(了解)
  • namespace{
        int a = 10;
        void func(){
            cout<<"hello namespace"<

你可能感兴趣的:(c++,开发语言)