目录
- c++命名空间
c++命名空间
1.概述
在c++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突性的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的c++库时,这些标识符的命名发生冲突,标准c++引入关键字namespace(命名空间/免费精选名字大全空间/名称空间),可以更好地控制标识符的作用域。
因此:命名空间的出现就是为了解决名称冲突问题
2.格式
namespace 空间名称 { 变量名称 ..... 函数声明 ..... }
3.定义范围
#include <iostream> using namespace std; namespace test#这是正确的命名形式 { ..... } int main() { namespace test01 #这是错误的命名形式 { } .... }
结论:命名空间只能在全局范围内定义
4.瀑布式开发格式
命名空间名称相同就是同一个命名空间
#include <iostream> using namespace std; namespace test { .... } namespace test #名称相同就是同一个命名空间 { ....... } int main() { ........ }
5.命名空间的访问方式
5.1空间名::变量名
#include <iostream> using namespace std; namespace test { int a = 10; } int main() { cout << test::a<<endl; ..... }
5.2using namespace 空间名
#include <iostream> using namespace std; namespace test { int a = 10; } using namespace test;#需要在命名空间定义之后 int main() { cout <<a<<endl; ..... }
需要注意的是:
在使用该语法时,需要在命名空间定义之后,否则会提示找不到。
6.命名空间可以无限嵌套
#include <iostream> using namespace std; namespace test01 { namespace test02 { namespace test { int a = 10; } } } using namespace test01::test02::test;#如果采用第二种方式的话就需要这样声明 int main() { cout << a << endl; }
7.权限
命名空间不存在私有的概念,都是共有的。
这个也很好理解,因为命名空间的出现就是为了解决名称冲突的问题。仅仅只是解决这个问题而已。
8.匿名命名空间
原则上禁止使用匿名命名空间,出现匿名命名空间这总机制就是为了解决名称冲突
在了解上面的基础之上,我们再来讲述下面的语法规则
匿名命名空间中定义的变量等同于全局变量,但是再背显式调用的时候,使用原生全局变量
相信大家看到这句话会觉得很绝望,但是呢,编程就是这样,直接看代码就对了。
#include <iostream> using namespace std; int a = 10; namespace #这就是匿名命名空间 { int a = 20; } int main() { cout << a <<endl; ..... }
大家猜一下,上面的结果是什么?是10 还是 20
结果是编译不通过!!!提示是:变量a是不明确的符号
正如上面所说,匿名空间中定义的变量等同于全局变量,那不就相当于定义了两个相同名称的全局变量。那不就重定义了吗
attention:c++中不存在变量的定义和声明
如果要想引用全局变量,那就是如下所示
#include <iostream> using namespace std; int a = 10; namespace #这就是匿名命名空间 { int a = 20; } int main() { cout << ::a <<endl; ..... }
大家猜一下,上面的结果是什么?是10还是20
结果是10!!!
正如上面所说,如果变量a被调用,则被调用的是原生全局变量,那就是10。
我们说了,匿名命名空间中定义的变量就相当于全局变量,意味着如果没有定义原生全局变量,那么就可以像调用原生全局变量一样调用匿名空间中的全局变量。
#include <iostream> using namespace std; namespace #这就是匿名命名空间 { int a = 20; } int main() { cout << a <<endl; #调用原生全局变量的方式 ..... }
9.别名
#include <iostream> using namespace std; int a = 10; namespace test { int a = 20; } namespace alise_test = test;#这就是给命名空间 int main() { cout << ::a <<endl; ..... }
原则上是不推荐给标准命名空间起别名
#include <iostream> using namespace std; int a = 10; namespace test { int a = 20; } namespace alise_std = std;#这是不建议的一种做法 int main() { cout << ::a <<endl; ..... }
10.编程模型
使用命名空间的时候,最好还是遵循某种格式。不遵循这种方式也是可以的,对于我而言,准许某种框架的目的在于简便自己编码。
namespace test { int a = 0;#变量名的定义 int add(int a , int b ); } int test::add(int a , int b ) { return a+b; }
ps:命名空间中存放的是变量初始化、函数的声明、类的声明等等,而函数的定义
11.using语法使用
using namespace 空间名;
这个语句可以在程序中的任何一个地方使用
#include <iostream> using namespace std; namespace test { int a = 20; } using namespace test; #test命名空间中的符号的作用域在该语句之后,该源文件之前 void hello(void) { using namespace test;#test命名空间中的符号的作用域在该语句之后,函数体之前 } int main() { cout << a <<endl; ..... }
attention:如果没有引用,命名空间里的代码块就不会被编译
如果命名空间中有大量的符号,采用上面一种方法就不太妥当,因为实际使用到的符号也就那么几个。
#include <iostream> using namespace std; namespace test { int a = 20; } using namespace test::a; #只使用test命名空间中的a变量 int main() { cout << a <<endl; ..... }
到此这篇关于详情介绍c++之命名空间的文章就介绍到这了,更多相关c++命名空间内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!
需要了解更多c/c++开发分享详情介绍C++之命名空间,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/791041.html