在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
举个例子:
#include <stdio.h> #include <stdlib.h> int rand = 10; int main() { printf("%d", rand); return 0; }
程序编译的结果显示rand重定义了,为什么会这样呢?因为在stdlib.h这个头文件中已经定义了rand这样一个函数,这样就导致了编译器不知道这是一个函数还是一个变量,C语言中无法应对这种冲突,只能通过改名字来避免。
而C++为了解决这个问题,引入了命名空间的概念。
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
//命名空间 //A就是命名空间的名字 namespace A{ int a; void func() {} }
注意事项:
接下来给一个完整的代码块来展示命名空间的注意事项和使用:
#include<iostream> //引入头文件 #include<string>//C++中的字符串 using namespace std; //标准命名空间 //A就是命名空间的名字 namespace A { //命名空间内既可以定义变量也可以定义函数 int rand = 10; int Sub(int x, int y) { return x + y; } struct ListNode { int data; struct ListNode* next; }; } //命名空间的嵌套定义 namespace B { int rand; namespace C { int rand; } } //命名空间是开放的,随时可以加入新成员,但是新成员只能在加入后使用 namespace B { int c;//此时c会合并到命名空间B中,实际上就是个合并的过程 } //匿名命名空间 namespace { int d = 5;//命名空间没有名字,就类似于static int d = 50,是个静态全局变量,别的文件无法使用 } int main() { //命名空间的使用 //1.::作用域限定符 //访问A空间的Sub函数 cout << A::Sub(10, 20) << endl; //2.访问嵌套空间 //访问B空间的C空间的rand变量 B::C::rand = 5; cout << B::C::rand << endl; system("pause"); return EXIT_SUCCESS; }
引入using关键字之后,命名空间的使用又变得不一样
namespace A { int a = 10; } void test01() { //using声明的意思就是让命名空间中某个标识符可以直接使用 using A::a; cout<<a<<endl; }
注意:
1.使用using声明,就不会每次写A::a了,直接用a就可以
2.using A::a声明的意思就是把变量a又在test函数中定义了一次,此时如果在test内部再定义一个int a;就会出错
namespace A { int a = 10; } using namespace A; void test01() { cout<<a<<endl; }
使用using关键字修饰namespace整个命名空间,实际上就是脱去了这个命名空间的外衣,就等价于你定义了一个int a在全局
思考一个问题:下面代码有错吗?
在test01函数体内又定义了一个int a,会报错么?如果不报错,那么输出的是全局的 a = 10 还是局部的a = 20?
namespace A { int a = 10; } using namespace A; void test01() { int a = 20; cout<<a<<endl; }
答案是不会报错,输出的是局部的20,因为命名空间A内部的变量a在使用using关键字后相当于在全局定义了一个int a ;而在函数体内定义一个局部的 int a;两个变量的作用域不同,是可以定义同名变量的,输出的是局部变量的值,小伙伴的要注意区分~
标签:c++,输入,文件,方法,编程,设置,代码,安装,链接,下载,压缩 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。