官方静态网站模板下载,小说盗版网站怎么做,宁津网站建设,龙岩app定制文章目录 命名空间的概念命名空间的定义命名空间定义的位置作用域每一个命名空间都是一个独立的域作用域符#xff1a;#xff1a; 编译器找一个变量/函数等的定义#xff0c;寻找域的顺序为什么要有命名空间#xff1f;1.解决库与程序员定义的同名的重定义问题2.解决程序员… 文章目录 命名空间的概念命名空间的定义命名空间定义的位置作用域每一个命名空间都是一个独立的域作用域符 编译器找一个变量/函数等的定义寻找域的顺序为什么要有命名空间1.解决库与程序员定义的同名的重定义问题2.解决程序员与程序员之间可能定义同名变量/函数等的问题 命名空间中定义的东西的生命周期如果命名空间的名字重名展开命名空间展开命名空间中的某一成员 命名空间重命名取别名 命名空间的概念 命名空间是用来组织和重用代码的 如同名字一样的意思NameSpace名字空间之所以出来这样一个东西是因为人类可用的单词数太少并且不同的人写的程序不可能所有的变量都没有重名现象 对于库来说这个问题尤其严重如果两个人写的库文件中出现同名的变量或函数(不可避免)使用起来就有重定义的问题 为了解决这个问题引入了命名空间这个概念通过使用 namespace xxx你所使用的库函数或变量就是在该名字空间中定义的这样一来就不会引起不必要的冲突了。 命名空间的定义
语法命名空间关键字namespace命名空间的名字{ 定义的东西 }
例
namespace My
{int malloc 10;int b 0;void dfs();
}命名空间中可以定义很多类型的东西 如 变量函数结构体类其他的命名空间等等
只要可以定义的东西都可以放到命名空间中定义 命名空间定义的位置
命名空间只能在全局或者另一个命名空间中定义 作用域
C中的作用域主要有以下4种 局部作用域这是最常见的类型它表示在特定函数或代码块如if语句、for循环、while循环、switch语句等被{}包括的内的变量。 局部变量在它们被声明的代码块或函数内有效当代码块或函数结束时它们就会被销毁。 文件作用域在C中一个源文件可以包含多个源代码文件。这些源代码文件中的变量和函数通常具有文件作用域。这意味着它们只在包含它们的文件中有效当源文件被包含到其他文件中时它们将不再存在。 命名空间作用域C引入了命名空间以避免名称冲突。命名空间作用域是一种特殊的范围它限制了命名空间中变量的可见性。通过使用命名空间可以防止其他代码中的名称与您的代码中的名称冲突。 全局作用域全局作用域是在整个程序中可见的变量和函数。它们可以在程序的任何地方访问只要它们在程序开始之前声明。 不同的作用域中可以有同名的变量/函数等 这也是为什么命名空间中可以有与局部域和全局域同名的变量 因为它们不在同一个作用域中 每一个命名空间都是一个独立的域
即两个名字不同的命名空间中的域是不同的 并不是所有命名空间都用同一个域 作用域符
左边左操作数是类名或者命名空间名右边右操作数是对应的左边左操作数的成员
表示类/命名空间作用域中的~成员 编译器找一个变量/函数等的定义寻找域的顺序
再没有用作用域指定该变量是哪一个作用域时
先在局部域中寻找是否有变量/函数的定义在局部域中找不到定义再去全局域和 展开 的命名空间中寻找【不分相后】
再使用作用域指定该变量是哪一个作用域时
直接去该作用域去寻找该变量的定义 为什么要有命名空间
为什么要有命名空间呢
1.解决库与程序员定义的同名的重定义问题
我们可以先看以下的C语言代码 可以看到VS报出了malloc重定义的错误
这是为什么呢 明明我在程序中没有定义过malloc啊
其实是有定义malloc的只不过不是程序员自己定义的而是头文件stdlib.h中定义了动态内存申请函数malloc
包含头文件其实就是包含了头文件中的所有代码【再编译时会展开头文件】
上述问题如果是在C语言中是没有办法解决的只能不用malloc这个名字定义变量/函数
但再C中就可以用命名空间来解决如下 定义一个命名空间把自己定义的malloc放进去再用命名空间的名字作用域符malloc就可以访问到命名空间中定义的mallo了
2.解决程序员与程序员之间可能定义同名变量/函数等的问题
这一条主要是在大型程序中需要多名程序员写不同区块的代码再合并成一个大程序时不同的程序员的代码中有同名的变量合并时就会产生与上一条问题类似的重定义问题
此时每一个程序员都把自己代码中的定义放在一个自己定义的命名空间中就不会产生重定义问题了 命名空间中定义的东西的生命周期
命名空间中定义的东西的生命周期与全局中定义的东西的生命周期一样 如果命名空间的名字重名
那么重名的命名空间会合并相当于还是一个命名空间 例
同一工程中不同的文件中定义的同名的命名空间也会合并 展开命名空间
语法using namespace 命名空间的名字 例
1.展开命名空间并不是把命名空间拷贝过来了命名空间的域与局部域和全局域还是不同的域
只是编译器可以默认去展开的命名空间的域中查找一个变量/函数等是否定义了 【即上面提到的编译器找一个变量/函数等的定义寻找域的顺序】
此时展开的命名空间中的成员的访问时可以不用在其前面加命名空间名了 例
2.如果展开了多个命名空间此时如果多个使用的命名空间中定义的东西同名或者与全局域中定义的东西同名就还是会有类似重定义的问题 例 所以不能为了方便随便展开命名空间 展开命名空间中的某一成员
语法using命名空间名命名空间的成员
例 命名空间重命名取别名
语法namespace 别名原命名空间名
例