namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都可能使用相同的名字来实现不同的库,于是程序员在合并程序的时候就会可能出现名字的冲突。namespace引入了复杂性,解决了这个问题。namespace允许像类,对象,函数聚集在一个名字下。本质上讲namespace是对全局作用域的细分。

我想大家都见过这样的程序吧:
hello_world.c
#include <iostream>
using namespace std;

int main()
{
    printf("hello world !");
    return 0;
}
我想很多人对namespace的了解也就这么多了
但是namespace远不止如此,让我们再多了解一下namespace

namespace的格式基本格式是
namespace identifier
{
    entities;
}
举个例子,
namespace exp
{
    int a,b;
}
有点类似于类,但完全是两种不同的类型。
为了在namespace外使用namespace内的变量我们使用::操作符,如下
exp::a
exp::b
使用namespace可以有效的避免重定义的问题
#include <iostream>
using namespace std;

namespace first
{
  int var = 5;
}

namespace second
{
  double var = 3.1416;
}

int main () {
  cout << first::var << endl;
  cout << second::var << endl;
  return 0;
}
结果是
5
3.1416
两个全局变量都是名字都是var,但是他们不在同一个namespace中所以没有冲突。

关键字using可以帮助从namespace中引入名字到当前的声明区域
#include <iostream>
using namespace std;

namespace first
{
  int x = 5;
  int y = 10;
}

namespace second
{
  double x = 3.1416;
  double y = 2.7183;
}

int main () {
  using first::x;
  using second::y;
  cout << x << endl;
  cout << y << endl;
  cout << first::y << endl;
  cout << second::x << endl;
  return 0;
}
输出是
5
2.7183
10
3.1416
就如我们所指定的第一个x是first::x,y是second.y

using也可以导入整个的namespace
#include <iostream>
using namespace std;

namespace first
{
  int x = 5;
  int y = 10;
}

namespace second
{
  double x = 3.1416;
  double y = 2.7183;
}

int main () {
  using namespace first;
  cout << x << endl;
  cout << y << endl;
  cout << second::x << endl;
  cout << second::y << endl;
  return 0;
}
输出是
5
10
3.1416
2.7183
正如我们所预见的导入的整个的first的namespace,前一对x,y的值就是first中的x,y的值。
这里我们不能在“using namespace first;“下加一句“using namespace second;“,为什么呢?
这样做无异于直接完全的忽视namespace first和namespace second,会出现重复定义的结果,所以前面的hello_world.c中的using指令的使用一定程度上存在问题的,只是因为我们就用了一个namspace,一旦引入了新的namespace这种做法很可能会出现重复定义的问题。

在头文件中,我们通常坚持使用显式的限定,并且仅将using指令局限在很小的作用域中,这样他们的效用就会受到限制并且易于使用。类似的例子有
#include <iostream>
using namespace std;

namespace first
{
  int x = 5;
}

namespace second
{
  double x = 3.1416;
}

int main () {
  {
    using namespace first;
    cout << x << endl;
  }
  {
    using namespace second;
    cout << x << endl;
  }
  return 0;
}
输出是
5
3.1416
可以看到两个不同的namespace都被限制在了不同作用域中了,他们之间就没有冲突。

namespace也支持嵌套
#include <iostream>

namespace first 
{
    int a=10;
    int b=20;

namespace second
    {   
        double a=1.02;
        double b=5.002;
        void hello();
    }

void second::hello()
    {   
    std::cout <<"hello world"<<std::endl;
    }
}

int main()
{
    using namespace first;

std::cout<<second::a<<std::endl;
    second::hello();
}
输出是
1.02
hello world
在namespace first中嵌套了namespace second,seond并不能直接使用,需要first来间接的使用。

namespace可以使用别名,在对一些名字比较长的namespace使用别名的话,是一件很惬意的事。但是与using相同,最好避免在头文件使用namespace的别名(f比first更容易产生冲突)。
namespace f = first;

最后,namespace提供了单独的作用域,它类似于静态全局声明的使用,可以使用未命名的namespace定义来实现:
namespace { int count = 0;}         //这里的count是唯一的
                                                //在程序的其它部分中count是有效的
void chg_cnt (int i) { count = i; }

转载于:https://www.cnblogs.com/DarrenChan/p/6163735.html

namespace for c++相关推荐

  1. C++ namespace 的作用以及使用

    namespace 是什么: 命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个任务中的所有类声明放在同一个命名空间中.标准C++库(不包括标准C库)中所包含的 ...

  2. javascript之namespace模式

    JavaScript 的命名空间并不是真正的命名空间, 只是在脚本内部创建一个封闭的小空间, 必须通过特定的空间名称才能对空间内部的代码进行访问, 这样可以防止同名函数和变量发生冲突, 也可以更方便地 ...

  3. 关于命名空间namespace

    虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits).接口.函数和常量. 在声明命名空间之前唯一合法的代码是用于定义源文件编码方 ...

  4. Namespace(命名空间)的使用

    作者:飞刀 关于Namespace(命名空间)的使用常用<% @ Import Namespace="System.Data" %>,这是在引用M$为我们提供的Name ...

  5. C++中的命名空间namespace

    1.Cpp中的命名空间 假设这样一种情况,当一个班上有两个名叫Zara的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等.同样的情况, ...

  6. Unable to locate Spring NamespaceHandler for XML schema namespace [http://cxf.apache.org/jaxws]

    利用cxf调试webservice接口的时候出现下面的错误 error:Unable to locate Spring NamespaceHandler for XML schema namespac ...

  7. Kubernetes学习笔记二:Namespace,Cgroups 的隔离与应用

    Kubernetes学习系列文章:Kubernetes-博客专栏 今天在学习极客时间专栏:<深入剖析Kubernetes> 第五讲05 | 白话容器基础(一):从进程说开去和第六讲06 | ...

  8. C++_static,类模板、函数模板、namespace

    C++_static,类模板.函数模板.namespace 1.static 2.类模板 3.函数模板 4.namespace 5.深入,更多细节 参考:侯捷<C++面向对象高级编程>

  9. linux网络命名空间详解,Linux Network Namespace (netns) 详解

    Linux Network Namespace (netns) 详解 Network Namespace (以下简称netns)是Linux内核提供的一项实现网络隔离的功能,它能隔离多个不同的网络空间 ...

  10. Vue教程5【vuex】getters,mapState,mapGetters,mapActions,mapMutations,模块化namespace

    vuex 什么时候需要使用? 状态(数据)共享! vuex工作原理 搭建vuex环境 创建文件 src/store/index.js//全局安装[--save生产环境] npm install -g ...

最新文章

  1. Eclipse上GIT插件EGIT使用手册
  2. windows免输密码登录
  3. Cortex-M3中的存储器映射
  4. C++静态全局变量问题
  5. 字符串匹配,KMP算法
  6. 《电路分析导论(原书第12版)》一1.2.2 真空电子时代
  7. Linux 硬盘管理
  8. Java并发编程实战读书笔记合集
  9. Java面试复习大纲2.0(持续更新)
  10. 语言设置修复计算机 没有光盘,如何在Windows中创建系统修复光盘
  11. 为什么这几年男生都不愿意去追女生了?
  12. 安装域、对域进行管理
  13. remosaic插值算法_手机镜头像素:硬件直出和插值有啥区别?
  14. [软考]软考教程+历年真题
  15. odoo14学习速记笔记
  16. 反相器下降沿延迟时间计算
  17. 迷你linux服务器,迷你Linux发行版 4MLinux 34.0 来了,你有试过吗
  18. GitHub的Java面试项目
  19. Vue+Element 实现订单列表【管理端】02
  20. JavaScript设置右下角悬浮窗

热门文章

  1. 教你如何一篇博客读懂设计模式之—--工厂模式
  2. ubuntu系统下Jenkins和tomcat的安装与配置
  3. haskell 求列表最大值_Haskell和自然数之基础篇
  4. HTML+CSS+JS实现 ❤️发光糖果泡泡动画特效❤️
  5. c语言黑白棋程序设计报告,C语言课程设计黑白棋
  6. echarts数据怎么赋值 vue_vue中 怎么把echarts中data的数据循环
  7. jdbc mysql api_JDBC Api详解
  8. Tableau2019版本安装步骤
  9. sr650服务器cpu型号,至强Gold 联想ThinkSystem SR650评测
  10. python私有成员和保护成员,喜大普奔!Maya 2022来了?!