Namespace 名称空间
在C语言里,通常只分成全局或局部的变量/函数.在大项目里,当不同开发人员写代码时,会有函数名相同和变量名相同引发的冲突.所以在C源码里,如果变量或函数只是在当前源文件里使用时,可加static修饰符.
在C++语言里,可以把全局空间划分成多个子空间(名称空间).在子空间里可以定义类型,函数,声明变量等,而不用管其它子空间里有没有相同的类型,函数及变量名等.也就是每个开发人员使用一个名称空间装载自定义的类型,函数等,这样即可避免冲突的状况.
注意:不属于任何一个名称空间的变量或函数就是属于全局空间的.
访问空间里的成员:空间的名称::成员
- 1
- 2 #include <stdio.h>
- 3
- 4 namespace myspace {
- 5 typedef unsigned intu32;
- 6 int num = 88;
- 7 void func()
- 8 {
- 9 printf("kkkk\n");
- 10 }
- 11 };
- 12
- 13 namespace kkspace {
- 14 typedef unsigned intu32;
- 15 int num = 99;
- 16 void func()
- 17 {
- 18 printf("nono\n");
- 19 }
- 20 };
- 21
- 22 int main(void)
- 23 {
- 24 myspace::num = 88;
- 25 kkspace::func();
- 26
- 27 myspace::u32 a = 88;
- 28 kkspace::u32 b = 11;
- 29 printf("%d,%d\n", sizeof(a), sizeof(b));
- 30
- 31 return 0;
- 32 }
名称空间里可以再划分出子空间来.
- 2 #include <stdio.h>
- 3
- 4 namespace myspace {
- 5 typedef unsigned intu32;
- 6 int num = 88;
- 7 void func()
- 8 {
- 9 printf("kkkk\n");
- 10 }
- 11
- 12 namespace myspace2 {
- 13 void func() {
- 14 printf("fffffff\n");
- 15 }
- 16 };
- 17 };
使用myspace2里的func函数时: myspace::myspace2::func();
使用名称空间,就是相当于把指定空间里的成员变为全局来访问.
用法:using namespace空间名
注意:如在函数体外声明使用名称空间,则整个程序所有函数都可直接访问空间里的成员而不需指定空间名.
如在函数体内声明,则只有此函数可以直接访问空间里的成员.
- 1
- 2 #include <stdio.h>
- 3
- 4 namespace myspace {
- 5 void func()
- 6 {
- 7 printf("kkkk\n");
- 8 }
- 9 };
- 10
- 11 using namespace myspace;
- 12 int main(void)
- 13 {
- 14 func();
- 15 return 0;
- 16 }
使用名称空间时需要注意不能与全局的变量或函数冲突.如下面myspace空间里有func函数,全局空间也有func函数,调用时就无法区分具体是用哪个函数了,这样是编译不过的.
- 1
- 2 #include <stdio.h>
- 3
- 4 namespace myspace {
- 5 void func()
- 6 {
- 7 printf("kkkk\n");
- 8 }
- 9 };
- 10
- 11 void func() {
- 12 printf("globalfunc\n");
- 13 }
- 14
- 15 using namespace myspace;
- 16 int main(void)
- 17 {
- 18 func();
- 19 return 0;
- 20 }
- 编译时的错误输出:
- [root@localhost 01namespace]#g++ 02test.cpp
- 02test.cpp: In function ‘intmain()’:
- 02test.cpp:18:7: error: callof overloaded ‘func()’ is ambiguous
- func();
- ^
- 02test.cpp:18:7: note:candidates are:
- 02test.cpp:11:6: note: voidfunc()
- void func() {
- ^
- 02test.cpp:5:7: note: voidmyspace::func()
- void func()
解决这问题也可以在调用时直接指定是哪个空间的函数
- 1
- 2 #include <stdio.h>
- 3
- 4 namespace myspace {
- 5 void func()
- 6 {
- 7 printf("kkkk\n");
- 8 }
- 9 };
- 10
- 11 void func() {
- 12 printf("globalfunc\n");
- 13 }
- 14
- 15 using namespace myspace;
- 16 int main(void)
- 17 {
- 18 myspace::func();
- 19 ::func(); //全局函数func
- 20 return 0;
- 21 }
- 名称空间里函数体在空间外实现.
- 空间里先声明函数原型,再在其它地方实现函数体.
- 1
- 2 #include <stdio.h>
- 3
- 4 namespace myspace {
- 5 void func();
- 6 };
- 7
- 8 int main(void)
- 9 {
- 10 using namespacemyspace;
- 11
- 12 func();
- 13 return 0;
- 14 }
- 15
- 16
- 17 void myspace::func()
- 18 {
- 19 printf("myspacefunc\n");
- 20 }
在c++里,已把标准输入,输出功能封装到名称空间std里了
std::cin表示输入流对象
std::cout表示输出流对象
std::cerr表示错误输出流对象
std::endl表示换行符
代码:
- 1
- 2 #include <iostream>
- 3
- 4 int main(void)
- 5 {
- 6 using namespace std;
- 7 int num;
- 8
- 9 cin >> num;
- 10 cout << num << endl;
- 11 返回 0;
- 12}
- 注意:代码里的” >>” /” <<”不是移位,是表示数据的方向
- 在/usr/include/c++/4.8.2/iostream头文件里:
- 42 名称空间 std_GLIBCXX_VISIBILITY(默认)
- 43 {
- 44_GLIBCXX_BEGIN_NAMESPACE_VERSION
- ...。
- 60 外部 流氓; ///链接到标准输入
- 61 extern ostream cout; ///链接到标准输出
- 62 extern ostream cerr; ///链接到标准错误(无缓冲)
- 63 extern ostream clog; ///链接到标准错误(缓冲)
- ...
- 76_GLIBCXX_END_NAMESPACE_VERSION
- 77} //命名空间