命名空间
我们自己定义的变量、函数可能跟库里面的重名冲突;多人协作开发时,也可能出现命名冲突;在C/C++中,变量、函数和以后要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,也可能会导致很多冲突。
C语言没有办法解决这个问题。所以在C++中提出解决这个问题的办法:使用命名空间(namespace关键字)。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。
命名空间定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
命名空间必须定义在全局,命名空间里面的变量也是全局的【命名空间里面可以声明、初始化变量,但是不能修改变量的值】,命名空间中可以定义变量、类型、函数等。
1.普通命名空间
namespace LY
{
int rand = 10;
int add(int a,int b)
{
return a + b;
}
struct Node
{
struct Node* next;
int data;
};
}
2.命名空间嵌套
namespace Name1
{
namespace Name2
{
int sub(int a,int b)
{
return a - b;
}
}
}
3.同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
namespace N1
{
int sub(int a,int b)
{
return a - b;
}
}
namespace N1
{
int add(int a,int b)
{
return a + b;
}
}
也就是说命名空间是开放的,即可以随时向已有的命名空间中添加新的成员。
4.无名命名空间
命名空间中的标识符只能在本文件内访问,相当于用static修饰该标识符,使其具有内部链接属性,在本文件中可以直接访问
#include <iostream>
using namespace std;
namespace
{
int b = 20;
}
int main()
{
cout<<b<<endl;
}
5.可以给命名空间取别名
#include <iostream>
using namespace std;
namespace LY
{
int a = 10;
}
int main()
{
namespace ly = LY;
cout << ly::a << endl;
}
【注意】:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
命名空间使用
如何使用该命名空间中的成员?使用域作用限定符::。
namespace LY
{
int rand = 10;
int add(int a,int b)
{
return a + b;
}
struct Node
{
struct Node* next;
int data;
};
}
int main()
{
printf("%d\n",LY::rand);
return 0;
}
这种方式隔离效果最好,但是使用比较麻烦,每个单独指定。
int main()
{
using LY::rand;
return 0;
}
这种最常用,展开某一个。
- 使用using namespace 命名空间名称引入
using namespace LY;
这种方式把命名空间展开到全局了 ,要慎用。
|