前言
在c/c++中,会有变量、函数以及后面的类,这些名称都要存在于局部的,可能会有冲突。
所以使用命名空间的意义就是,对标识符的名称进行本地化,以避免命名冲突或者名字的污染。
namespace关键字 就是针对这种问题的。
像这里,在stdlib头文件里已经有了rand这个函数,但是又定义了一个变量,名字与他一样,当程序打印rand时候,不知道是哪个,产生了歧义。
所以为了避免这样,就会有命名空间。
命名空间的定义
定义命名空间需要用到namespace关键字,后面接命名空间的名字,然后{}写体内,里面的就是命名空间的成员。
定义一个命名空间叫做 hello
命名空间里面包含着变量rand
当主函数执行第一个printf语句时,先在局部里面找,没找到就去全局里面找,当然前面的头文件在编译的时候就已经全部展开了,相当于全局,然后rand函数在全局,rand是函数名,那么以%d打印就是函数的地址。
第二个printf语句就是直接去访问hello 的命名空间里面的rand。
这里的 namespace hello 就是一堵墙一样,把自己定义的函数,变量等包围起来,避免与全局的某个名称相同有歧义,当需要去用自己定义的函数,变量,就去用作用域限定符去访问命名空间。
定义的方式:
1.正常定义命名空间
namespace hello
{
int rand = 10;
int Add(int x, int y)
{
return x + y;
}
}
2.命名空间可以嵌套
namespace N1
{
int rand = 10;
int Add(int x, int y)
{
return x + y;
}
namespace N2
{
int a = 1;
int Sub(int x, int y)
{
return x - y;
}
}
}
在访问的N2时,比如:访问a变量。
N1::N2::a
3.同一个工程里,允许存在多个相同名称的命名空间,编译器会合并成为一个命名空间
同一个域里面不能有同一个名字的声明,会冲突。
命名空间的使用
命名空间里面可以定义变量、函数、类型
namespace N1
{
int rand = 10;
int Add(int x, int y)
{
return x + y;
}
struct Node
{
int val;
struct Node* next;
};
}
命名空间的使用方式:
1.加命名空间名称以及作用域限定符
2.使用using将命名空间中某个成员引入(指定展开)
#include <iostream>
using std::cout;
int main()
{
cout << "hello";
return 0;
}
在c++里,std是它标准库的命名空间,c++将标准库的定义实现都放在了这个命名空间里。
所以cout 也在std里面,但是为了每次用cout都要去 std::cout ,就用using std::cout ,把cout专门展开了。
但就算专门展开了,也可以用 std::cout ;
这个是简单的把命名空间的a开放了
3.使用using namespace 命名空间名称 引入(全部展开)
#include <iostream>
using namespace std;
int main()
{
cout << "hello";
return 0;
}
这里就是将整个std展开了
这里就是将整个命名空间hello展开了。