命名冲突问题
#include <stdio.h>
#include <stdlib.h>
int rand=0;
int main()
{
printf("%d ", rand);
return 0;
}
- 我们自己定义的变量,函数可能和库里面的冲突。
- 做大项目,多人协作时,与同事命名冲突。
可以使用命名空间来解决这些问题,每一个用户声明的命名空间都代表一个不同的命名空间域,在该命名空间中,可以包含嵌套其他的命名空间,以及函数,类型,变量等的声明和定义。在该命名空间内部声明的实体被称为命名空间成员。
命名空间的定义
- 普通的命名
namespace GENIE
{
int a;
int Sub(int a, int b)
{
return a - b;
}
}
- 命名空间可以嵌套
namespace GENIE
{
int a;
struct Node
{
struct Node* next;
int val;
};
namespace SHE
{
int b;
int c;
}
}
- 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
A.h文件代码:
namespace GENIE
{
int ADD(int x,int y);
double val;
}
B.cpp文件的代码实现
include"A.h"
namespace GENIE
{
int ADD(int x,int y)
{
return x+y;
}
double val=3.14;
}
在同一个作用域中,如果新声明的一个命名空间的名称与前面声明过的命名空间的名称同名,那么这个后声明的命名空间就是前面声明的命名空间的累加,这两部分内容属于同一个命名空间。
命名空间的使用
1.加命名空间名称及作用域限定符 ’ :: ’
namespace GENIE
{
int x = 1;
int y = 2;
int ADD(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
}
int main()
{
printf("%d ", GENIE::x);
}
- 使用using,一次引入一个命名空间成员
using 声明的作用是:使一个命名空间成员在当前作用域中可见,可见的范围是从using声明的语句开始,直到当前作用域结束。如果在using声明语句之后,在当前作用域中又嵌套了其他的作用域,那么using声明在当前作用域中的嵌套作用域中也同样有效。
namespace GENIE
{
int x = 1;
int y = 2;
int ADD(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
}
using GENIE::y;
int main()
{
printf("%d ", GENIE::x);
printf("%d ", y);
}
- 使用using namespace命名空间引入所有命名空间成员
namespace GENIE
{
int x = 1;
int y = 2;
int ADD(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
}
using namespace GENIE;
int main()
{
printf("%d ", x);
printf("%d ", y);
}
|