• 【C++】命名空间和using namespace std的注意事项


    在这里插入图片描述

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
    📃个人主页 阿然成长日记 👈点击可跳转
    📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
    🚩 不能则学,不知则问,耻于问人,决无长进
    🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

    一.命名空间定义:

    1.在C语言中只有一个全局作用域: 所有的全局标识符共享一个作用域 ,这使得标识符之间可能发生冲突。
    2.C++中提出了命名空间的概念: 命名空间将全局作用域分成不同的部分,不同命名空间中的标识符可以同名而不会发生冲突 ,命名空间可以发生嵌套 ,全局作用域也叫默认命名空间。

    二.为什么用命名空间

    1.案例引入

    看下面一段代码:

    
    #include 
    #include 
    
    int strlen = 10;
    int main()
    {
    	printf("%d", strlen);
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.执行结果分析

    执行会报错 “strlen”: 重定义

    意思就是说,我们定义的变量名strlen与string.h库的strlen函数名冲突了 ,因为同一个作用域里面不能有相同的名称,但是C语言没办法解决这种问题,所以C++中引入了命名空间这个概念。

    3.补充

    其实还有一个原因就是当一个项目需要多个人写的时候,就难免会出现名称冲突的情况,这时候如果是C语言我们对于这种问题只能要求程序员之间去修改名称,但是如果是C++的话,我们可以用命名空间,来允许多个名称相同的情况。

    三、命名空间的定义方式(namespace)

    定义命名空间,需要用到namespace关键字,然后加上一个命名空间的名字,最后花括号{}括起来即可

    1 .通常定义

    namespace A{}

    在这里插入代码片
    namespace A   //A的命名空间
    {
    	int a = 20;
    	int b = 30;
    	...//也可以定义函数
    }
    namespace B //B的命名空间
    {
    	int a = 40;
    	int b = 60;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2. 嵌套定义

    使用方式:
    namespace A{
     …
       namespace B{
          …
        }
    }

    在这里插入代码片
    namespace N1
    {
    	int a;
    	int b;
    	int Add(int left, int right)
    	{
         	return left + right;
     	}
    namespace N2//嵌套在N1中
     {
        int c;
        int d;
        int Sub(int left, int right)
        {
             return left - right;
        }
     }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    四、命名空间的使用

    域作用限定符 ::使用

    方式就是 作用域 ::变量名,如果作用域为空格则为在全局域中寻找变量。

    #define _CRT_SECURE_NO_WARNINGS 1
    #include 
    int j = 0;
    
    namespace July
    {
    	int J = 10;
    	int U = 11;
    	namespace July1
    	{
    		int L = 20;
    		int Y = 21;
    	}
    }
    
    using namespace July;//释放July的命名空间,
    
    int main()
    {
    	printf("%d\n", July1::L);//L是嵌套在July1中的变量,
    	printf("%d\n", J);//因为释放了July,打开了该命名空间中的所有变量,函数,方法;所以使用的是命名空间中的变量J,就不用在家作用域
    	//printf("%d\n", July::J);就不用这么写了
    	//如果没有Using name July ,那么,此时使用J变量是会报错,
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    1.加命名空间名词和域作用限定符

    命名空间::变量

    这种方式是是能在写了【命名空间::变量】这里使用,作用域最小

    #define _CRT_SECURE_NO_WARNINGS 1
    #include 
    namespace July
    {
    	int J = 10;
    	int U = 11;
    }
    int main()
    {
    	printf("%d\n", July::J);//看这里
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.使用using将命名空间中某个成员引入

    这种方式也叫局部展开,就是把命名空间中的一些变量在全局域中展开了。

    使用方式:using 命名空间 ::变量

    #define _CRT_SECURE_NO_WARNINGS 1
    #include 
    namespace July
    {
    	int J = 10;
    	int U = 11;
    	namespace July1
    	{
    		int L = 20;
    		int Y = 21;
    	}
    }
    using July::J;//这种方式也叫局部展开,就是把命名空间中的一些变量在全局域中展开了。
    int main()
    {	
    	printf("%d\n",J);
    	return 0;
    }```
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.使用using namespace 命名空间名称 引入

    这种方式也叫全局展开,就是把命名空间中的所有变量在全局域中展开。

    #define _CRT_SECURE_NO_WARNINGS 1
    #include 
    namespace July
    {
    	int J = 10;
    	int U = 11;
    	namespace July1
    	{
    		int L = 20;
    		int Y = 21;
    	}
    }
    using namespace July;//释放July的命名空间,即可以直接使用里面的所有变量,函数等等
    int main()
    {
    	
    	printf("%d\n",J);
    	printf("%d\n",U);
    	printf("%d\n", July1:: L);
    	printf("%d\n", July1:: Y);
    	//可以使用全部
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    以小见大: using namespace std 也就是这样的道理,只是说std里面包含了C++标准程序库中的所有 变量,函数,对象。

    五、using namespace std的注意事项

    1. using namespace std是什么

    1️⃣ 打开标准命名空间浅青色文字:即告诉编辑器我们将要使用名字空间std中的函数或者对象。
    2️⃣using意思就是正在使用的意思。
    3️⃣.namespace 在 C++ 中被提出来,用来解决 C语言 不能重定义的问题
    namespace 被称为 命名空间 ,作用就是 将变量 或 函数等 规划到了不同的作用域 ,这样就起到了 将变量隔离的效果,就不用再担心会有重定义的现象发生了。
    4️⃣std:是个名称空间标识符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准库中的函数或者对象都要用std来限定。

    2.using namespace std为什么少用

    1.标准库是不断更新的,更新后std新增的标准库命名可能会和更新前我们代码中自定义的命名冲突,所以不建议代码中直接把std全部导入,用到什么导什么,最安全。
    2.使用后你的整个代码将无法使用与std标准库中的名字。不使用using namespace std就是为了 有效的防止命名冲突
    3.标准库里的变量&函数非常多且命名方式不唯一,当你项目的代码量足够大时很难保证不与标准库内的命名恰好一样,我们在做项目时一般都会用自己定义的变量/函数实现一些功能,允许这些自己的东西在全局使用才是我想要的,而不是我每次使用自己的东西还要通过命名空间去取,这样反倒更影响我写代码的效率了。
    以上内容仅个人学习随记,如有不对,敬请指导!
    🍉 🍓 🍑 🍈 🍌 🍐 🍍 🍠 🍆 🍅 🌽

  • 相关阅读:
    响应式设计的实现方式
    每天几道Java面试题:集合(第四天)
    点击切换图片-javascript
    【unity小技巧】适用于任何 2d 游戏的钥匙门系统和buff系统——UnityEvent的使用
    面向无线传感器网络WSN的增强型MODLEACH设计与仿真(Matlab代码实现)
    认真学习MySQL的逻辑架构
    FreeSWITCH添加自定义endpoint
    Linux环境详解
    roofs 根文件系统制作
    洛谷P2440 木材加工 —二分答案
  • 原文地址:https://blog.csdn.net/luhaoran814/article/details/133933591