长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Hello world
  • C++ 数据类型
  • 运算符优先级
  • 命名空间
    • 命名空间定义
      • 命名空间可以是不连续的
      • 全局命名空间
      • 嵌套命名空间
      • 内联命名空间
    • 命名空间的使用
      • 命名空间别名
      • using声明和using指示
      • 直接使用
  • 多线程的基本用法(C++11)
  • C++类对象的成员内存占用
  • C++
DC Wang
2022-03-25
目录

命名空间原创

# 3.1 命名空间的using声明

命名空间是一种防止命名冲突的策略,在不同命名空间下可以使用相同的名字。在构建大型项目时,往往会使用多个独立开发的库,这些库又会定义大量全局名字,如类、函数、模板等。C++使用命名空间(namespace)来避免命名空间污染(namespace pollution)。

# 命名空间定义

namespace shop {
    char* name;
    int stars;
}// 无须分号
1
2
3
4

# 命名空间可以是不连续的

在上面定义的shop命名空间中添加一些新成员声明。

namespace shop {
    class Book{/*...*/};
    class Food{/*...*/};
}
1
2
3
4

命名空间定义可以不连续的特性使得我们可以按以下方式组织命名空间。

  • 头文件命名空间:类的定义,以及声明作为类接口的函数和对象
  • 源文件命名空间:类的实现

这种接口和实现分离的机制确保我们所需的函数和其他名字只定义一次,而只要用到这些实体的地方都能看到对实体名字的声明。

定义多个类型不相关的命名空间应该使用单独的文件分别表示每个类型(或关联类型构成的集合)。

如果一个函数的声明在命名空间中,函数定义时用到命名空间中的名字可以简写。

# 全局命名空间

::member_name
1

表示全局命名空间的一个成员。

# 嵌套命名空间

namespace A {
    namespace A1 {
        int a;
    }
    namespace A2 {
    }
}
1
2
3
4
5
6
7
// 访问变量a
A::A1::a = 1;
1
2

# 内联命名空间

内联命名空间的名字可以被外层命名空间直接使用。

inline namesapce version5{
    int versionNum;
}
1
2
3

关键字inline出现在命名空间第一次定义的地方,后续定义可不写。

使用场景:代码发布版本发生改变时,常常将新版设置为内联,旧版不设置内联。

namesapce version4{
    int versionNum;
}
1
2
3

version将同时使用这两个命名空间。将每个命名空间定义在同名头文件中,则version定义如下所示:

namespace version{
    #include "version4.h"
    #include "version5.h"
}
1
2
3
4

因为version5是内联的,所以形如version::versionNum的代码可以直接获取version5的成员,使用version4则需要加上完整的外层命名空间version::version4::versionNum。

# 命名空间的使用

# 命名空间别名

namespace s = shop;
namespace a1 = A::A1;
1
2

# using声明和using指示

using声明(using declaration)一次只引入一个命名空间成员,作用域与变量作用域类似。

using namespace shop::Book;
1

using指示(using directive)使得某个命名空间中所有名字都可见

using namespace shop;
1

# 直接使用

A::A1::a = 1;
1
编辑 (opens new window)
#C++
上次更新: 2022/10/03, 09:24:26
运算符优先级
多线程的基本用法(C++11)

← 运算符优先级 多线程的基本用法(C++11)→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式