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 return 0; 12 } 注意:代码里的”>>”/”<<”不是移位,是表示数据的方向 在/usr/include/c++/4.8.2/iostream头文件里: 42 namespace std_GLIBCXX_VISIBILITY(default) 43 { 44_GLIBCXX_BEGIN_NAMESPACE_VERSION …. 60 extern istream cin; /// Linked to standard input 61 extern ostream cout; /// Linked to standard output 62 extern ostream cerr; /// Linked to standard error (unbuffered) 63 extern ostream clog; /// Linked to standard error (buffered) … 76_GLIBCXX_END_NAMESPACE_VERSION 77 } // namespace