C++ 命名空间--namespace总结
目录
- 定义
- 意义
- 名字空间的三种使用方法
- 匿名空间
- 名字空间嵌套
- 总结
定义
namespace 名字空间的名字{ 全局变量 类型定义 函数 }
意义
对于一个较大型的C++程序来说,需要由多个程序员相互协作编写,这样的情况下容易出现不同程序员在需要负责的程序部分使用相同名字的变量或函数,导致程序合并后出现问题。名字空间的作用,就是将不同程序员编译的程序放入相应的名字空间,每个名字空间相对独立,空间内的变量和函数名只局限于当前空间下,从而解决命名冲突的问题。
名字空间的三种使用方法
(1)作用域限定符 名字空间名::标识符 表示明确访问是特定名字空间中的特定标识符 最麻烦 (2)名字空间指令 using namespace 名字空间名; 该语句可以在任何地方 表示在该指令之后,对指令所指的名字空间中所有标识符对当前作用域都可见 接下来都可以直接访问名字空间中的标识符,不需要加"名字空间名::" 当然也可以加 *对当前作用域可见 (3)名字空间声明 using 名字空间::标识符 将指定名字空间中的某个标识符(成员)引入到当前作用域,可以直接访问 *导入到当前作用域
#include <iostream> using namespace std; //定义名字空间 namespace wd1{ int g = 1024; void func(void){ cout << "func" << endl; } struct Stu{ int no; char name[40]; }; } int main(){ using wd1::g; cout << g << endl; cout << wd1::g << endl; wd1::func(); struct wd1::Stu s = {}; using namespace wd1; cout << g << endl; func(); struct Stu s2 = {}; return 0; } /*using wd1::g; cout << g << endl; 和 cout << wd1::g << endl; 就只是其中的两种定义方法,两个是等价的*/
匿名空间
编译器为没有指明名字空间的全局区的标识符置于匿名名字空间中 如果要指明访问匿名名字空间中的标识符 直接用 ::标识符 匿名的命名空间是C++的特性,相对于C的static声明来说, 可以在匿名的空间里面声明很多 变量和函数,这样可以省去了对每个变量和函数添加static声明. 实质上匿名空间的功能跟static声明是一样的
#include <iostream> using namespace std; //如果一个全局的标识符没有指定名字空间,编译器将会为其缺省地置于匿名名字空间中 int gv = 1024; int main(){ cout << gv << endl; cout << ::gv << endl; //访问指定名字(匿名名字)空间中的标识符 int gv = 9527; cout << gv << endl;//访问局部的 局部优先原则 同名的局部变量会隐藏同名的全局变量 cout << ::gv << endl;//访问全局的 return 0; }
名字空间合并
一个程序中,如果名字空间名字相同,则认为是同一个名字空间 里面的标识符会进行合并
#include <iostream> using namespace std; namespace myspace{ int x = 1024; void func(){ cout << "func" << endl; } } namespace myspace{ int y = 9527; void bar(){ cout << "bar" << endl; } } int main(){ using namespace myspace; cout << x << endl; cout << y << endl; func(); bar(); return 0; }
名字空间嵌套
一个名字空间包含另外一个名字空间 不能直接 using namespace 里层名字空间; 对于当前作用域而言是不可见
#include <iostream> using namespace std; //int x = 1; namespace s1{ int x = 1024; namespace s2{ int y = 9527; namespace s3{ int z = 1314; } } namespace s4{ int x = 520; } } int main(){ using s1::x; cout << x << endl; cout << s1::x << endl; //cout << y << endl; cout << s1::s2::y << endl; using s1::s2::y; cout << y << endl; using namespace s1; using s2::y; //using namespace s3; using namespace s1::s2::s3; cout << z << endl; using namespace s4; cout << x << endl;//有两个名字空间中都有x 因为它们对当前作用域没有优先级关系 所以会有歧义 return 0; }
using namespace 外层名字空间;
using namespace 里层名字空间;
using namespace 外层名字空间::里层名字空间;
注意: 如果用using namespace 名字空间;进行名字空间声明当前作用域可见 如果不同的两个作用域中含有相同名字和标识符,不访问没问题 但是如果用直接访问,则会产生歧义 using namespace 名字空间; 进行声明不会有歧义 using 名字空间名::标识符 可能会有歧义
举个例子来说明
#include <iostream> using namespace std; namespace s1{ int x = 1111; } namespace s2{ int x = 9527; } int main(){ cout << s1::x << endl; cout << s2::x << endl; using namespace s1; cout << x << endl; using namespace s2; // cout << x << endl;//会有歧义 cout << s1::x << endl; cout << s2::x << endl; using s2::x; //导入到当前作用域 cout << x << endl; cout << s1::x << endl; //using s1::x;//当前作用域中有一个x了 return 0; }
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
赞 (0)