C++命名空间namespace
2023-03-15 23:22:46 时间
我们常常会见到这样的语句:
using namespace std;
或者还有这样的:
using std::string;
这些其实就是使用了C++的命名空间技术。
什么是命名空间呢?命名空间可以看做一个声明区域,其区域内的变量在内部有效,比如假设有两个命名空间:
namespace Jack {
double pail;
void fetch();
}
namespace Jill {
double pail;
void fetch();
}
两个命名空间有着一样的变量,但因为是在不同的命名空间内,所以互相不会发生冲突。我们在使用时可以这样调用:
Jack::pail = 12.34;
Jill::pail = 56.78;
Jack::fetch();
所以,我们有时候也会看到这样的代码:
int x;
std::cin >> x;
std::cout << x << std::endl;
但如果我们使用了using声明,就可以简单一点:
using std::cin;
using std::cout;
using std::endl;
int x;
cin >> x;
cout << x << endl;
或者更简单的,我们可以使用using编译指令:
using namespace std;
int x;
cin >> x;
cout << x << endl;
其中,cin、cout、endl都是存在于std命名空间内的。
上面其实是两种using,一个叫using声明,一个叫using编译指令。using声明用于声明命名空间内的某一个变量或函数,而using编译指令会将整个命名空间全部都声明。
一般而言我们建议对需要的变量或函数使用using声明,这样就不用一股脑全部声明,难保有些变量或者函数在别的命名空间内也有,这样又会产生冲突,实际上这是不允许的。
命名空间也是可以嵌套的。
有些命名空间没有名字:
namespace {
int ice;
int water;
}
这种命名空间因为没有名字,所以不能用using声明和using编译指令来操作,也就不能再其他文件使用,只能在当前文件声明处到作用域结尾可用,这也就类似于static的作用了。实际上C++不建议使用static,而更推荐这种做法:
static int counts;// 不推荐
namespace {
int counts;// 推荐
}
int main() {
...
}
而命名空间用的最多的地方,就是供其他文件去访问了。就像std一样。
对于命名空间的使用,也有一些指导原则:
- 使用已命名的命名空间中声明的变量,而不是外部全局变量或静态全局变量。
- 如果开发函数库或者类库,将其放在一个命名空间中。
- 不要过度使用using编译指令。
- 不要在头文件使用using编译指令,以防产生未知影响。
- 导入命名时,首选使用using声明。
- 对于using声明,首选将其作用域设为局部而不是全局。
相关文章
- HTTPS中的加密算法相关概念
- 初创公司数据科学项目全流程指南,一位资深数据科学家的经验谈
- 大数据治理的五个核心要素
- PHP图片处理库Grafika详细教程(4):图形绘制
- PHP图片处理库Grafika详细教程(3):图像属性处理
- PHP图片处理库Grafika详细教程(2):图像特效处理模块
- 预测2019年大数据、云存储将发生什么
- PHP图片处理库Grafika详细教程(1):图像基本处理
- 人工智能的困境:并不能打消众人的疑虑
- Flask插件系列 - Flask-Mail
- 数据分析惯用的5种思维方法
- Socket编程实战
- Kotlin + Spring Boot服务端开发
- 机器学习竞争其实是一场数据上的竞争
- 从工业大数据本质看工业大数据下的决策方式
- PHP混合Go协程并发
- PHP之十六个魔术方法详解
- 企业如何释放大数据的潜力
- 如何用轻量协作工具做bug管理
- 中数经纬副总裁林师授:在大数据领域,我们的征途是星辰大海