前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++命名空间namespace

C++命名空间namespace

作者头像
Cloudox
发布2021-11-23 14:14:56
3730
发布2021-11-23 14:14:56
举报
文章被收录于专栏:月亮与二进制月亮与二进制

我们常常会见到这样的语句:

代码语言:javascript
复制
using namespace std;

或者还有这样的:

代码语言:javascript
复制
using std::string;

这些其实就是使用了C++的命名空间技术。

什么是命名空间呢?命名空间可以看做一个声明区域,其区域内的变量在内部有效,比如假设有两个命名空间:

代码语言:javascript
复制
namespace Jack {
  double pail;
  void fetch();
}

namespace Jill {
  double pail;
  void fetch();
}

两个命名空间有着一样的变量,但因为是在不同的命名空间内,所以互相不会发生冲突。我们在使用时可以这样调用:

代码语言:javascript
复制
Jack::pail = 12.34;
Jill::pail = 56.78;
Jack::fetch();

所以,我们有时候也会看到这样的代码:

代码语言:javascript
复制
int x;
std::cin >> x;
std::cout << x << std::endl;

但如果我们使用了using声明,就可以简单一点:

代码语言:javascript
复制
using std::cin;
using std::cout;
using std::endl;
int x;
cin >> x;
cout << x << endl;

或者更简单的,我们可以使用using编译指令:

代码语言:javascript
复制
using namespace std;
int x;
cin >> x;
cout << x << endl;

其中,cin、cout、endl都是存在于std命名空间内的。

上面其实是两种using,一个叫using声明,一个叫using编译指令。using声明用于声明命名空间内的某一个变量或函数,而using编译指令会将整个命名空间全部都声明。

一般而言我们建议对需要的变量或函数使用using声明,这样就不用一股脑全部声明,难保有些变量或者函数在别的命名空间内也有,这样又会产生冲突,实际上这是不允许的。

命名空间也是可以嵌套的。

有些命名空间没有名字:

代码语言:javascript
复制
namespace {
  int ice;
  int water;
}

这种命名空间因为没有名字,所以不能用using声明和using编译指令来操作,也就不能再其他文件使用,只能在当前文件声明处到作用域结尾可用,这也就类似于static的作用了。实际上C++不建议使用static,而更推荐这种做法:

代码语言:javascript
复制
static int counts;// 不推荐
namespace {
 int counts;// 推荐
}
int main() {
  ...
}

而命名空间用的最多的地方,就是供其他文件去访问了。就像std一样。

对于命名空间的使用,也有一些指导原则:

  • 使用已命名的命名空间中声明的变量,而不是外部全局变量或静态全局变量。
  • 如果开发函数库或者类库,将其放在一个命名空间中。
  • 不要过度使用using编译指令。
  • 不要在头文件使用using编译指令,以防产生未知影响。
  • 导入命名时,首选使用using声明。
  • 对于using声明,首选将其作用域设为局部而不是全局。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/3/13 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档