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