【C++】命名空间(namespace)详解
一、为什么使用命名空间
考虑一种情况,当我们有两个同名的人,Zara,在同一个班里。当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字,比如这个区域,如果它们生活在不同的区域或者它们的母亲或父亲的名字,等等。
在您的C++应用程序中也会出现同样的情况。例如,您可能正在编写一些具有名为xyz()函数的代码,并且还有另一个可用的库,它也具有相同的xyz()函数。现在编译器无法知道您在代码中引用的xyz()函数的哪个版本。
名称空间(namespace)被设计来克服这个困难,并被用作额外的信息来区分类似的函数、类、变量等等,它们在不同的库中具有相同的名称。使用名称空间,您可以定义定义名称的上下文。本质上,名称空间定义了一个范围。
二、命名空间的定义
在C语言中只有一个全局作用域:
1.C语言中所有的全局标识符共享一个作用域 |
2.标识符之间可能发生冲突 |
C++中提出了命名空间的概念:
1.命名空间将全局作用域分成不同的部分, |
2.不同命名空间中的标识符可以同名而不会发生冲突 |
3.命名空间可以发生嵌套 |
4.全局作用域也叫默认命名空间 |
语法:
namespace Name
{namespace Internal{/*...*/}/*...*/
}
C++命名空间的使用:
使用整个命名空间:using namespace name; |
使用命名空间中的变量:using name::variable |
使用默认命名空间中的变量: ::variable |
Example:
#include <stdio.h>
#include <iostream>
namespace First
{int i = 0;
}namespace Second
{int i = 1;namespace Internal //嵌套命名空间{struct P //嵌套命名空间{int x;int y;};}
}int main()
{using namespace First; //使用整个命名空间using Second::Internal::P; //使用嵌套的命名空间printf("First::i = %d\n", i);printf("Second::i = %d\n", Second::i); //使用命名空间中的变量P p = { 2, 3 };printf("p.x = %d\n", p.x);printf("p.y = %d\n", p.y);system("pause");return 0;
}
编译运行,输出结果:
三、using指令
可以使用using namespace指令避免使用名称空间前置。该指令告诉编译器后续代码正在使用指定命名空间中的名称。
Example:
#include <iostream>
using namespace std;// first name space
namespace first_space {void func() {cout << "Inside first_space" << endl;}
}// second name space
namespace second_space {void func() {cout << "Inside second_space" << endl;}
}using namespace first_space;
int main () {// This calls function from first name space.func();return 0;
}
编译运行,输出结果:
四、std命名空间
下列代码可以引用cout而不预先添加命名空间:
#include <iostream>
using std::cout;int main () {cout << "std::endl is used with std!" << std::endl;return 0;
}
编译运行,输出结果:
<本文完>
参考资料:
1)唐佐林《C++深度解析教程》
2) tutorialspoint
【C++】命名空间(namespace)详解相关推荐
- 【C++】命名空间namespace详解
一.命名空间的引入 C++中,名称(name)可以是符号常量.变量.宏.函数.结构体.枚举.类和对象等等.而在大型工程中,难免会有重名的现象,命名空间namespace,就是C++引入的一种解决名称冲 ...
- C/C++中命名空间(namespace)详解及其作用介绍
命名空间 (namespace) 可以帮助我们区分不同库中相同名称的函数, 类, 变量等. 使用了命名空间即定义了上下文. 命名空间就是定义了一个范围. 命名空间 为了解决 C++ 标准库中的标识符与 ...
- 【024】C++对C的扩展之命名空间namespace详解
C++对C的扩展 引言 一.面向对象编程概述 1.1.面向过程 1.2.面向对象 二.作用域运算符 :: (双冒号) 三.命名空间 namespace 3.1.命名空间使用语法 3.2.using声明 ...
- k8s之Namespace详解
Namespace 隔离资源 默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的.但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的name ...
- Docker 基础技术之 Linux namespace 详解
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Docker ...
- Linux ns 5. IPC Namespace 详解
文章目录 1. 简介 2. 源码分析 2.1 copy_ipcs() 2.2 ipcget() 2.3 ipc_check_perms() 2.4 相关系统调用 参考文档: 1. 简介 进程间通讯的机 ...
- Linux ns 3. Mnt Namespace 详解
1. 文件系统层次化 对 Linux 系统来说一切皆文件,Linux 使用树形的层次化结构来管理所有的文件对象. 完整的Linux文件系统,是由多种设备.多种文件系统组成的一个混合的树形结构.我们首先 ...
- 【转】C#中的命名空间namespace全解
.NET Framework 类库提供下列命名空间: [Microsoft] Microsoft.CSharp 包含支持用 C# 语言进行编译和代码生成的类. Microsoft.JScript 包含 ...
- django url 中的namespace详解
[引子] django是一个比较全能的web框架,比如它实现了自己的orm模型来对接不同的数据库.并提供了方便的数据接口:django牛逼的地方 还有许多,如他实现了自己的模板语言,这样我们就能方便的 ...
最新文章
- Android 中的 Service 全面总结
- CrowdRec:众包环境中,基于信任感知的工人推荐
- 再论CMMI和敏捷的对话
- Mac系统下Homebrew的安装和使用Homebrew安装python
- 两条线段的夹角 cesium_《原本》命题1.10 一条线段可以被分成两条相等的线段
- 被吹得天花乱坠的无服务器架构,究竟是什么?
- jeecg boot一对多新增的附表不会主键是一个string_测试开发专题:spring-boot如何使用JPA进行双向一对多配置...
- 带有emplace开头的STL为何优于其它插入函数
- C++中log的底数理解
- 二刻拍案惊奇之——国人为什么那么轻视技术
- java class object_[java]Class类和Object类的关系
- 动态规划---01背包问题(2种方法)
- 如何用DOM4J编程使用xml schema
- 微信开放平台开发第三方授权登陆(三):Android客户端
- android网页编辑软件,HTML5编辑器
- MySQL查看表结构SQL语句
- 网页查看计算机硬件,怎么查看电脑硬件设备的Guid值?
- 程序君带你畅聊发送短信验证码
- websphere 实用_将WebSphere Cast Iron Studio PGP活动与外部PGP实用程序一起使用
- [HSCSEC 2023] rev,pwn,crypto,Ancient-MISC部分