C++中的命名/名字/名称空间 namespace
1、问题引入
\quad 探讨:在实际的系统开发中,所有的开发工作,通常都不会仅由一个人来开发完成,不同的人只负责自己功能模块,他们在设计时,比如声明变量,通常情况下,不会考虑其他人是否已使用该变量名,在模块功能测试时,相互之间是独立的,完全没有问题,当系统功能合成 时,不可避免地会出现变量或函数的命名冲突,因为变量或函数重名而导致的问题将会造成一定的混乱。所以如何在同一个.cpp文件中定义相同变量名的两个全局变量呢
#include<iostream>
int val = 200;
int val = 300;
int main()
{
return 0;
}
现象:编译会报错
解决方法:使用命名空间区分这两个全局变量
2、概念
其实命名空间就是类似一个黑盒子
3、作用
防止名字冲突
4、格式
namespace 命名空间名字
{
//声明定义变量
//声明定义函数
//定义结构体/共用体/枚举 数据类型
//声明类 定义对象
}
5、使用命名空间中的成员
5.1 using编译指令( 引进整个命名空间) —将这个盒子全部打开
using namespace 命名空间名字;
5.2 using声明使特定的标识符可用(引进命名空间的某个成员) —将这个盒子中某个成员的位置打开
using 命名空间名字::成员名;
5.3 调用的时候指定是哪一个命名空间下的成员
cout<<命名空间名字::成员名
6、示例代码
#include<iostream>
using namespace std;
//使用名称空间LcdSpace
namespace LcdSpace{
int x = 10;
int y = 20;
typedef struct{
int data;
}Data_t;
enum {
LCD_COLOR_RED,
LCD_COLOR_GREEN
};
int lcd_init()
{
return 0;
}
};
//使用名称空间TouchSpace
namespace TouchSpace{
int x = 100;
int y = 200;
};
//外部的全局变量
//int x = 1000;
//int y = 2000;
//2)使用using声明的方式去引入名字空间中的某个成员
//把这个TouchSpace黑盒子 打开一个角落,正好把某个成员放出来
//格式:using 命名空间名字::成员名;
//using TouchSpace::x;
void test01()
{
using namespace LcdSpace;
cout<<"x:"<<x<<" y:"<<y<<endl;
}
int main()
{
//3)使用using编译指令的方式 打开整个名字空间
using namespace TouchSpace;
//如何使用名字空间里面的成员
//1)使用 作用域限定符:: 去指定
//格式: 名字空间的名字::成员变量名
std::cout<<TouchSpace::x<<" "<<TouchSpace::y<<std::endl;
std::cout<<x<<" "<<y<<std::endl;
std::cout<<LcdSpace::x<<" "<<LcdSpace::y<<std::endl;
LcdSpace::Data_t data;
LcdSpace::lcd_init();
//我们有时候为了强调该变量的全局特性,可以在前面加上::修饰
cout<<x<<" "<<y<<endl;
test01();
return 0;
}
7、命名空间的嵌套
namespace myspace{
int x=10;
int y=20;
namespace spaceA{
int a=100;
void setValue(int data)
{
a = data;
}
void printValue()
{
std::cout<<"a:"<<a<<std::endl;
}
}
}
使用:
myspace::spaceA::printValue();
8、同名命名空间
\quad 命名空间可以分开定义,也就是说,你在定义一个命名空间之后,如果后面想要在这个命名空间里面再次添加某些数据成员或者函数成员,可以再次接着定义。
namespace myspace{
int x=10;
int y=20;
}
namespace myspace{
int a=100;
int b=200;
void print()
{
std::cout<<"x:"<<x<<" y:"<<y<<std::endl;
}
}
9、匿名命名空间
namespace {
int data=123;
}
可以在本文件中直接使用data, 限制空间中的成员只能在本文件中使用,类似c语言中的static修饰
10、全局作用域
\quad
全局作用域是从C语言就开始有的一种作用域,在C++中,有时为了强调某符号的全局特性,或为了避免与导入的名字空间中的重名符号冲突,会在使用全局符号的时候加上 作用域解析符
int global = 100;
int main()
{
int global = 200;
// 重名的标识符,外层的作用域会被内层的掩盖
cout << global << endl; // 输出200
// 使用双冒号引用全局作用域中的标识符
cout << ::global << endl; // 输出100
}
- 全局作用域的名字空间是匿名的,引用全局作用域符号只需加 :: 即可。
- 名字空间的本质就是作用域,遵守C语言关于作用域的基本原则,如内层作用域重名符号会掩盖外层作用域的重名符号。