[C++] namespace命名空间和using用法

命名空间namespace:指标识符的各种可见范围。

C++标准程序库中的所有标识符都被定义在一个std的namespace,这就是程序开始添加 using namespace std; 的原因。

很多人共同完成一套代码,不可能不出现标识符命名相同的问题,为了解决冲突问题,产生了命名空间namespace。

命名空间包括又名命名空间和无名命名空间

一、有名命名空间

有名命名空间的定义格式:

namespace 空间名 {
    code
}

// 有名命名空间的嵌套定义
namespace 空间名1 {
    code
    namespace 空间名2 {
        code
    }
}

有名命名空间的使用格式:

// 直接使用"::"连接空间名和code
空间名:: code;    // code为变量或函数

有名命名空间取别名为了方便使用,定义格式如下:

namespace 别名 = 空间名;

using 指令使用格式:

// 表示后面代码都使用此命名空间,如果属空于本空间,无需再使用"::"连接空间名和code
using namespace 空间名; // 空间名支持嵌套

//最常用的std空间
using namespace std;

举例:

#include
// 使用std命名空间下的变量
using namespace std;

int a = 5;

namespace A {
    int a = 10;

    // 命名空间支持嵌套定义
    namespace B {
        int a = 15;
        int b = 20;
    }

    // 命名空间可以重复定义,相当于扩充
    namespace B {
        int x = 30;
        int y = 35;
    }
}

namespace C {
    int a = 25;
    // 错误,命名空间不能嵌套声明
//    namespace D;
}

int main(void)
{
    // 如果不写using namespace std,就必须加前缀std::
    std::cout << "Hello World!" << std::endl;
    cout << endl;    // 换行

    cout << "a = " << a << endl;
    cout << "A::a = " << A::a << endl;
    cout << "A::B::a = " << A::B::a << endl;
    cout << "C::a = " << C::a << endl;

    // 错误,提示变量b没有声明
//    cout << "b = " << b << endl;

    cout << endl;

    // 命名空间取别名
    namespace AB = A::B;
    cout << "AB = A::B" << endl;
    cout << "AB::a = " << AB::a << endl;
    cout << "AB::b = " << AB::b << endl;

    cout << endl;

    // 后面的代码使用A::B命名空间下的变量
    using namespace A::B;
    cout << "使用A::B命名空间" << endl;
    cout << "b = " << b << endl;
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;

    return 0;
}

执行结果:

[C++] namespace命名空间和using用法

二、无名命名空间

命名空间不仅可以避免名称冲突,还可以是代码保持局部性,从而保护代码不被他人非法使用。

在当前的编译单元直接使用无名命名空间中的成员,但是在当前编译单元之外,它是不可见的

无名命名空间定义格式:

namespace {
    code
}

举例:

#include
// 使用std命名空间下的变量
using namespace std;

// 如果定义与无名命名空间相同,则会产生冲突报错
//int a = 5;

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

    namespace B {
        int a = 30;
        int b = 40;
    }

    int add(int a, int b)
    {
        return (a + b);
    }
}

int main(void)
{
    // 默认使用无名命名空间中的变量和空间
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "B::a = " << B::a << endl;
    cout << "B::b = " << B::b << endl;

    cout << endl;

    cout << "a + b = " << add(a, b) << endl;
    cout << "B::a + B::b = " << add(B::a, B::b) << endl;

    return 0;
}

执行结果:

[C++] namespace命名空间和using用法

总结:

1、命名空间可以嵌套定义,但不能嵌套声明;

2、可以多次声明和定义同一命名空间,相当于扩充,并添加新成员;

3、无名命名空间中的成员不能与同一文件中外部的成员相同;

4、无名命名空间中的成员使用方式与全局变量使用方式相同。

Original: https://www.cnblogs.com/lialong1st/p/12006169.html
Author: LeeAaron
Title: [C++] namespace命名空间和using用法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535054/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【转】C++知识点总结

    其他路径: 微信公众号:程序喵星人 更多资源和视频教程,QQ:1902686547 这篇文章是对C++的知识点做了一些简单的总结,基本包含了所有的C++基础知识点。以下提到的知识点…

    C++ 2023年5月29日
    062
  • C++ 内存池 — C++ Memory Pool

    这是我翻译的文章,来自 Code Project, 原文作者: DanDanger2000. 原文链接: http://www.codeproject.com/cpp/Memory…

    C++ 2023年5月29日
    087
  • c++11并行、并发与多线程编程

    首先,我们先理解并发和并行的区别。 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃…

    C++ 2023年5月29日
    067
  • C++中如何精确地输出特定类型的位数

    precision()函数和fixed合用的方法。 其中,fixed表示使用一般的方法(不是科学计数法之类的)输出浮点数。precision是cout自定义的函数,用来设置小数输出…

    C++ 2023年5月29日
    059
  • 关于C++单件模式释放对象

    最近接触的一个项目要用到单件模式,我像往常一样哒哒(敲击键盘ing)一个单件模式的典型结构很快就出现在我的面前: 不知道为什么,这次突然觉得new这个单词太耀眼了,熟悉c++的程序…

    C++ 2023年5月29日
    050
  • C++ d-bus 使用实例

    因为以后工作用的到D-bus,这两天抽空看了下c++下得d-bus的使用方法。因为网上对c++下得d-bus使用说明几乎没有,所以,在这里记录下以供同仁使用。同时感谢shengpe…

    C++ 2023年5月29日
    068
  • EclipseC++学习笔记-10 warnings being treated as errors,,error: format ‘%u’ expects argument of type

    增加选项All Options增加-Wformat=0 本博客是个人工作中记录,遇到问题可以互相探讨,没有遇到的问题可能没有时间去特意研究,勿扰。另外建了几个QQ技术群:2、全栈技…

    C++ 2023年5月29日
    056
  • C++基础 (杂七杂八的汇总 )

    各数据类型在32位系统和64位系统占的字节数: C类型 32 64 char 1 1 short int 2 2 int 4 4 long int 4 8 long long in…

    C++ 2023年5月29日
    071
  • C++深拷贝与浅拷贝

    对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a;而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝…

    C++ 2023年5月29日
    050
  • 哈希表查找(散列表查找) c++实现HashMap

    算法思想: 哈希表 什么是哈希表 在前面讨论的各种结构(线性表、树等)中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和…

    C++ 2023年5月29日
    086
  • libj 0.8.2 发布,Java/JavaScript API 的 C++ 实现

    libj 0.8.2 增加了一些新的字符串相关的方法。 libj 是一个跨平台的运行库,相当于提供了类似 Java/JavaScript API。libj 的内存管理是自动的,基于…

    C++ 2023年5月29日
    053
  • C++ extern用法总结(转)

    在C语言中,修饰符extern用在变量或者函数的声明前,用来说明”此变量/函数是在别处定义的,要在此处引用”。 (1)extern修饰变量的声明 如果文件a…

    C++ 2023年5月29日
    060
  • 使用VS2015进行C++开发的6个主要原因

    使用VS2015进行C++开发的6个主要原因 使用Visual Studio 2015进行C++开发 在今天的 Build 大会上,进行了”将你的 C++ 代码转移至 …

    C++ 2023年5月29日
    076
  • c++报错: No viable overloaded ‘=’ 临时变量与引用参数 const

    对于一个函数的参数为引用,如果想接收临时变量,就必须加上 const。 class A{ public: A(int aa) {} }; void f(A& a) { };…

    C++ 2023年5月29日
    067
  • C++ 创建静态链接库和动态链接库

    上篇文章演示了如恶化使用C++ 编译的静态链接库和动态链接库,本篇文章主要介绍如何创建静态链接库和动态链接库,本文使用的工具是visual studio 2019 企业版,需要安装…

    C++ 2023年5月29日
    068
  • 使用Javah 生成C/C++头文件

    注意:编写java的接口文件。 注意native代码端一定不要有大括号,且要有”;”结尾。 需要让eclipse自动编译生成class文件。 调整路径到cl…

    C++ 2023年5月29日
    049
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球