AI 助理
备案 控制台
开发者社区 开发与运维 文章 正文

using namespace std 是什么意思——C++命名空间

简介: using namespace std 是什么意思——C++命名空间

我们先看一段C代码:


#include <stdio.h>
#include <stdlib.h>
int rand = 0;
int main()
{
  printf("%d", rand);
  return 0;
}
1


我们直接看可能不会发现问题,但是这段代码是运行不出来的

15fdf419f9544435b33fd8dfaaf8f8ac.png


原因就是rand名与stdlib.h库中的函数命冲突,所以运行不出来


命名冲突的发生有2个原因:

1.跟库中冲突

2.一个项目不同部分由不同人编写,最后合并时发生命名冲突


为了避免自己定义的变量名或函数命与库中的名冲突,于是在C++中引入了命名空间这一概念。


namespace命名空间

局部域和全局域

我们先了解一下 局部域 和 全局域,在同一域中不可以创建2个同名变量,但在同一域中可以创建2个同名变量


下面在局部域和全局域建立2个同名变量


#include <iostream>
int a = 1;//全局域
int main()
{
  int a = 0;//局部域
  printf("%d\n", a);
  return 0;
}


那么在这里如果要输出a的值,那么输出的是全局域中的值还是局部域中的值呢?


答案是:输出局部域中的a值


6bc80d41780142baa3be54d40106c46c.png





所以可以得出一个结论:搜索范围是先局部域再全局域,默认是在局部域中搜索,如果没有局部域,再在全局域中搜索


如果想要输出全局域中的a怎么办呢?


使用::域作用限定符,::a就表示全局域中的a


#include <iostream>
int a = 1;//全局域
int main()
{
  int a = 0;//局部域
  printf("%d\n", ::a);
  return 0;


10

namespace

下面我们通过namespace创建一个命名空间域


namespace test
{
  int a = 2;
}


那么现在我们怎么输出这个命名空间域中的a呢?


C++中的搜索范围是:局部域->全局域,如果不展开命名空间或指定访问命名空间,是不会去命名空间中搜索的

只有展开命名空间或指定访问命名空间才会搜索到命名空间域中


可以看到,不展开命名空间也不指定访问命名空间,是不会输出命名空间域中的a


#include <iostream>
namespace test
{
  int a = 2;
}
//int a = 1;//全局域
int main()
{
  //int a = 0;//局部域
  printf("%d\n", ::a);
  return 0;
}





1e4a3bbeda364617b47326408ab0791b.png



展开命名空间

下面用using namespace test展开命名空间域


说明:这里展开的意思是编译器是否去域里进行搜索

与#include本质不同,不要错误理解


#include <iostream>
namespace test
{
  int a = 2;
}
using namespace test;//展开命名空间域
int a = 1;//全局域
int main()
{
  int a = 0;//局部域
  printf("%d\n", a);
  return 0;
}


这时,三个域中的a是可以共存的,按照搜索顺序,这里会输出局部域中的a

这里如果删除掉全局域和局部域中的a,这里就会输出命名空间域中的a


如果去掉局部域中的a,展开命名空间域,此时在全局域和命名空间域中都有一个a,那么这时如果不使用::,会输出哪个a呢


#include <iostream>
namespace test
{
  int a = 2;
}
using namespace test;//展开命名空间域
int a = 1;//全局域
int main()
{
  //int a = 0;//局部域
  printf("%d\n", a);
  return 0;
}

5

答案是会发生命名冲突


d9ac1df52f074f8dbf90ca859cddac77.png







这是因为展开后就代表着里面的内容就暴露到全局,与原全局域中的a冲突


所以可以看出,using namespace不是特别好,using namespace的本意是为了防止冲突,但是展开后又会发生冲突


所以不要轻易的使用using namespace


指定命名空间

我们还可以通过展开命名空间的方法去搜索命名空间域中的a

也是使用域作用限定符::

printf("%d\n", a);//输出局部域中的a
printf("%d\n", ::a);//输出全局域中的a
printf("%d\n", test::a);//输出命名空间域中的a
1


这样,就不会发生任何冲突

所以,如果只想使用某个命名空间中的一两个函数或变量,指定命名空间就可以,没有必要展开整个命名空间


命名空间的嵌套

命名空间是支持嵌套的,因为如果我们把所有的变量、函数、结构都放在一个命名空间中时,也会不可避免的发生冲突


//命名空间的嵌套
namespace A1
{
  int aa = 10;
  namespace A2
  {
  int aa = 20;
  }
}


9

怎么去访问嵌套的命名空间中的元素呢?

多次使用::


printf("%d\n" ,A1::aa); //访问A1中的aa
printf("%d\n", A1::A2::aa);//访问被嵌套的A2中的aa
1
2

不同文件中的同名命名空间

在不同文件中的同名命名空间,最终会合并在一起


这里我们在2个不同的头文件中创建了同名命名空间




f846a57a5d0b4d85a538e783a7e8bc5c.png



到了源文件中,这2个命名空间就自动合并了

#include "A.h"
#include "B.h"
int main()
{
  std::cout << hhh::a << std::endl;
  std::cout << hhh::b << std::endl;
}
1


using namespace std 是什么意思

std是C++库的命名空间,std中包含了STL和C++库




c81aa6307f5a42d1b2367dedd030dca1.png



C++中常用的输入输出也都在std中,所以我们平常在创建cpp文件后都会第一时间把using namespace std写上


#include <iostream>
using namespace std;
int main()
{
  cout<<"hello"<<endl;
}

的内容,我们知道 直接展开会有风险,如果自己定义跟库重名,就会报错

所以在平时日常练习时可以展开,在一些项目中建议指定访问,不轻易展开命名空间


下面是通过指定访问实现输出:


#include <iostream>
int main()
{
  std::cout<<"hello"<<std::endl;
  std::cout<<"hello"<<std::endl;
  std::cout<<"hello"<<std::endl;
  std::cout<<"hello"<<std::endl;
}
1


在每一个cout和·endl前面都要加上std::,这么看起看来十分麻烦且枯燥,所以还有一种写法。就是将常用的展开

//将常用的展开
using std::cout;
using std::endl;
int main()
{
  cout << "hello" << endl;
}
Jambo!
目录
相关文章
长梦
|
3月前
|
存储 前端开发 安全
C++一分钟之-未来与承诺:std::future与std::promise
【6月更文挑战第27天】`std::future`和`std::promise`是C++异步编程的关键工具,用于处理未完成任务的结果。`future`代表异步任务的结果容器,可阻塞等待或检查结果是否就绪;`promise`用于设置`future`的值,允许多线程间通信。常见问题包括异常安全、多重获取、线程同步和未检查状态。解决办法涉及智能指针管理、明确获取时机、确保线程安全以及检查未来状态。示例展示了使用`std::async`和`future`执行异步任务并获取结果。
长梦
58 2
可能只会写BUG
|
17天前
|
安全 C++
C++: std::once_flag 和 std::call_once
`std::once_flag` 和 `std::call_once` 是 C++11 引入的同步原语,确保某个函数在多线程环境中仅执行一次。
可能只会写BUG
37 3
蓝易云
|
8天前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
蓝易云
22 0
土木林森
|
1月前
|
程序员 C++ 开发者
C++命名空间揭秘:一招解决全局冲突,让你的代码模块化战斗值飙升!
【8月更文挑战第22天】在C++中,命名空间是解决命名冲突的关键机制,它帮助开发者组织代码并提升可维护性。本文通过一个图形库开发案例,展示了如何利用命名空间避免圆形和矩形类间的命名冲突。通过定义和实现这些类,并在主函数中使用命名空间创建对象及调用方法,我们不仅解决了冲突问题,还提高了代码的模块化程度和组织结构。这为实际项目开发提供了宝贵的参考经验。
土木林森
44 2
可能只会写BUG
|
18天前
|
C语言 C++
C++(六)Namespace 命名空间
命名空间(Namespace)是为了解决大型项目中命名冲突而引入的机制。在多库集成时,不同类库可能包含同名函数或变量,导致冲突。C++通过语法形式定义了全局无名命名空间,并允许对全局函数和变量进行作用域划分。命名空间支持嵌套与合并,便于协同开发。其使用需谨慎处理同名冲突。
可能只会写BUG
18 0
DuckBro
|
1月前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
DuckBro
34 4
呆呆宝
|
2月前
|
存储 C++ 运维
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
呆呆宝
38 6
呆呆宝
|
2月前
|
C++ 运维
开发与运维编译问题之在C++中在使用std::mutex后能自动释放锁如何解决
开发与运维编译问题之在C++中在使用std::mutex后能自动释放锁如何解决
呆呆宝
46 2
长梦
|
2月前
|
C++
C++一分钟之-类型别名与using声明
【7月更文挑战第20天】在C++中,类型别名和`using`声明提升代码清晰度与管理。类型别名简化复杂类型,如`using ComplexType = std::vector&lt;std::shared_ptr&lt;int&gt;&gt;;`,需注意命名清晰与适度使用。`using`声明引入命名空间成员,避免`using namespace std;`全局污染,宜局部与具体引入,如`using math::pi;`。恰当应用增强代码质量,规避常见陷阱。
长梦
53 5
长梦
|
2月前
|
安全 编译器 C++
C++一分钟之-C++中的属性命名空间
【7月更文挑战第22天】C++11引入属性作为元数据,虽无内置属性命名空间,但可通过自定义属性与命名空间组合实现类似效果。例如,创建`perf`命名空间存放`slow`和`fast`属性来标记函数性能。正确使用属性需注意位置、避免重复和确保与实现一致,以提升代码可读性和编译器理解。通过模拟属性命名空间,可以更有效地管理和使用属性。
长梦
40 1

热门文章

最新文章

  • 1
    C++模板初阶
  • 2
    C++第11周项目3(3)——回文数
  • 3
    C++语言基础 例程 案例:一个接口,多种方法
  • 4
    C++ Internals: STL之Map
  • 5
    C/C++程序员上手C#应该知道的100件事(21~30)
  • 6
    C++编程规范之18:尽可能局部地声明变量
  • 7
    C++实践参考解答:我的数组类
  • 8
    C++语言基础 例程 类模板
  • 9
    《C++语言基础》实践参考——图书馆的书
  • 10
    Eclipse C/C++开发环境搭建
  • 1
    C++一分钟之-编译时计算:constexpr与模板元编程
    87
  • 2
    Python和C++在内存管理方面有什么不同?
    38
  • 3
    如何根据项目需求选择使用C++还是Python进行内存管理?
    38
  • 4
    C++和Python在内存管理上的主要区别是什么?
    76
  • 5
    C++学习之引用
    21
  • 6
    C++学习之结构体
    28
  • 7
    C++学习之面向对象
    26
  • 8
    C++学习之指针
    21
  • 9
    C++学习之函数
    17
  • 10
    C++学习之程序流程结构
    31
  • 相关课程

    更多
  • C++ 入门教程开发文档
  • 相关电子书

    更多
  • 使用C++11开发PHP7扩展
  • GPON Class C++ SFP O;T Transce
  • GPON Class C++ SFP OLT Transce
  • 下一篇
    搭建自己的私有云盘工具总结

    玻璃钢生产厂家鹰潭特色玻璃钢雕塑定做价格寿宁玻璃钢花盆花器荣欣辉玻璃钢雕塑镜面玻璃钢雕塑价格合理红河玻璃钢花盆奥体百货商场美陈江苏大型主题商场美陈哪里买金昌卡通玻璃钢雕塑哪家好北京市商场美陈哪家公司好新乡价值观校园玻璃钢景观雕塑玻璃钢创意雕塑造型玻璃钢战争雕塑贵州公园玻璃钢雕塑定做马鞍山玻璃钢雕塑价钱玻璃钢室外雕塑报价莱州玻璃钢雕塑浙江商场美陈供货商济源人物玻璃钢卡通雕塑厂家武汉坚实玻璃钢座椅雕塑济南玻璃钢雕塑摆件有哪些个性化玻璃钢雕塑图片标识玻璃钢雕塑报价南通玻璃钢雕塑公司遵义玻璃钢雕塑生产厂家推荐潮州玻璃钢动物雕塑销售厂山西玻璃钢雕塑报价六安佛像玻璃钢雕塑商场美陈评比标准常州商场春季美陈清远主题玻璃钢雕塑定制香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

    玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化