一、提出问题
先看一段代码
#include<stdio.h>
#include<stdlib.h> //该库文件中声明了一个名为rand的函数,用于产生一个随机数
int rand = 0;
int main() {
printf("%d\n", rand);
return 0;
}
这里的根本问题在于,printf 不知道要打印哪个rand,因为库文件中有一个rand,全局变量也有一个rand
所以当我们自己定义的变量 和 库文件里的函数同名时,会发生名字冲突
那么应该如何处理?? ========> 这个时候就轮到namespace出场了
二、namespace
namespace内部的变量、函数与外部隔离
1、命名空间定义
namespace 空间名
{
//当前空间的成员
}
//例1:定义一个名为 N1 的命名空间
namespace N1
{
int rand = 0;
struct Node
{
}
int Add(int x,int y)
{
return x+y;
}
}
//例2:一个命名空间可以嵌套另一个命名空间
namespace N1
{
int rand = 0;
//命名空间 N2
namespace N2
{
int Sub(int x,int y)
{
return x-y;
}
}
}
2、命名空间的使用
namespace N1
{
int rand = 0;
int Add(int x,int y)
{
return x+y;
}
}
(1)方式一(推荐):通过 空间名+作用域限定符引入
使用方式 ======> 空间名::成员变量名
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("%d\n", rand); //使用stdlib库中的rand函数
printf("%d\n", N1::rand); //使用N1命名空间中的rand变量
printf("%d\n", N1::Add(1,2)); //使用N1命名空间中的Add函数
return 0;
}
(2)方式二:using单独引入空间中的某个成员
一般用于引入命名空间中一些常用的变量
使用方式 ==========> using 空间名::成员变量名
#include <stdio.h>
using N1::rand; //using 相当于解除了隔离效果,此时会和stdlib的rand函数发生冲突
int main() {
printf("%d\n", rand); //可直接使用N1命名空间中的rand变量
return 0;
}
(3)方式三(不推荐):using namespace 引入命名空间的中的全部成员
#include <stdio.h>
using namespace N1; //using namespace 解除了命名空间 N1 的隔离效果
//N1 中的内容在当前文件中展开
int main() {
printf("%d\n", rand); //可直接使用N1命名空间中的rand变量
printf("%d\n", Add(1,2)); //可直接使用N1命名空间中的Add函数
return 0;
}
三、using namespace std
我们在使用cout、cin的时候,常常会看到这句话
因为命名空间std中包含了 C++的库函数,using namespace 解除了 std的隔离效果,让std在当前文件中展开
引入 iostream.h 文件,然后我们可以直接使用 cout、cin
#include <iostream.h>
int main(){
cout << "hello,world!!" <<endl;
return 0;
}
学习阶段可以使用这种方式
实际应用的时候,不推荐使用,把std在当前文件展开,可能会发生 同名冲突