C++中的命名空间详细介绍

作者:EJoft 时间:2023-12-12 06:18:07 

命名空间的特性

首先熟悉一下命名空间的两个概念。

声明区域:可以在其中进行声明的区域,如全局文件的声明区域是文件,函数内声明的变量声明区域为代码块。潜在作用域:潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,因为变了必须定义后才能使用。
这两个概念通过下图很好理解,也是编程的常识。

C++中的命名空间详细介绍

C++中的命名空间详细介绍

声明命名空间和命名空间成员

可以使用如下语法声明命名空间和空间成员

namespace Jack {
double a;
struct b {};
void f();
}

全局命名空间

如果未在显式命名空间中声明某个标识符,则该标识符属于隐式全局命名空间的一部分。 一般情况下,尝试避免在全局范围内进行声明(入口点 Main 函数除外,它必须位于全局命名空间中)。
全局命名空间可以是用 ::var 来调用。

不连续命名空间

即同一个命名空间可以在多个文件中定义,如
file1.cpp

namesapce A {
int a;
}

file2.cpp

namesapce A {
int b;
}

在编译时会将分散在各个文件中的同一个命名空间集合在一起。

嵌套命名空间

命名空间也是可以嵌套的

namespace A {
namespace B {}
}

using声明和using编译指令

using声明将特定的名称添加到它所属的声明区域中,例如using A::a;,相当于 Java 中的静态导入,而using 编译指令使名称空间的所有名称都可以用,而不需要使用作用于解析符,如 using namespace std;,作用相当于 Java 中的。import java.util.*。这里记录一 * 意点。

using A::pal;
using B::pal; // error declaration conflict
pal = 4;

上述代码会引起冲突。
一般而言使用using声明会更安全点。

命名空间别名

命名空间名称必须是唯一的,这意味着通常它们不应太短。 如果名称的长度使代码难以读取,或在不能使用 using 指令的标头文件中键入枯燥,则可以创建一个命名空间别名作为实际名称的缩写。 例如:

namespace a_very_long_namespace_name { class Foo {}; }
namespace AVLNN = a_very_long_namespace_name;
void Bar(AVLNN::Foo foo){ }

综合代码示例

#include <iostream>

using namespace std;
namespace A {
   int a = 100;
   namespace B            //嵌套一个命名空间B
   {
       int a = 20;
   }
}

int a = 200;//定义一个全局变量

int main(int argc, char *argv[]) {
   cout << "A::a =" << A::a << endl;
   cout << "A::B::a =" << A::B::a << endl;
   cout << "a =" << a << endl;
   cout << "::a =" << ::a << endl;

int a = 30;
   cout << "a =" << a << endl;
   cout << "::a =" << ::a << endl;

return 0;
}

output:

A::a =100
A::B::a =20
a =200
::a =200
a =30
::a =200

来源:https://blog.csdn.net/EJoft/article/details/122900592

标签:C++,命名空间
0
投稿

猜你喜欢

  • Java 集合概览(小结)

    2023-11-08 02:50:37
  • 简单实现Android应用的启动页

    2022-04-15 14:23:45
  • Unity实现VR中在黑板上写字效果

    2021-08-04 20:11:11
  • C# 图片与Base64码的相互转化问题(代码详解)

    2021-11-30 22:56:16
  • SpringBoot接入钉钉自定义机器人预警通知

    2022-07-23 00:29:45
  • IntelliJ IDEA 2019.1.1 for MAC 下载和注册码激活教程图解

    2023-07-23 08:01:50
  • C#中Clone一个对象的值到另一个对象案例

    2022-10-11 21:41:14
  • 不使用Math.random方法生成随机数(随机数生成器)

    2021-11-28 05:08:46
  • Android 通过productFlavors实现多渠道打包方法示例

    2022-08-27 16:04:35
  • Android ViewPager实现页面左右切换效果

    2022-12-28 04:49:35
  • Java-JFrame窗体美化方式

    2022-08-17 10:07:38
  • Android使用Room操作数据库流程详解

    2023-03-21 21:00:31
  • Java中静态类型检查是如何进行的实例思路详解

    2022-01-01 16:08:30
  • redisson 实现分布式锁的源码解析

    2022-06-05 05:38:47
  • C#写差异文件备份工具的示例

    2022-02-21 02:14:00
  • spring boot validation参数校验实例分析

    2023-02-03 02:50:38
  • Android超清晰6.0权限申请AndPermission

    2023-08-05 10:52:26
  • Maven项目部署到服务器设置访问路径以及配置虚拟目录的方法

    2023-12-04 02:12:12
  • 解析Java实现随机验证码功能的方法详解

    2022-09-25 23:26:14
  • 微服务架构设计RocketMQ基础及环境整合

    2023-02-18 17:18:15
  • asp之家 软件编程 m.aspxhome.com