15.3.2 推荐用法
为了在程序的多个文件中合理使用名称空间,需要合理组织名称空间的定义,与类定义相似(但又不同,类定义中成员变量不被创建,而名称空间中的变量在声明时被创建),一种推荐的做法是将名称空间的声明接口(仅包括函数原型)放在头文件中,而将变量声明和函数实现放在单独的.cpp文件中,这样在使用头文件的地方,只要包含相应的头文件即可,如示例代码15.9所示。
代码15.9 名称空间文件组织FileOrgnization
<————————————————文件名:namespaceAB.h———————————-> 01 namespace B//创建名称空间B 02 { 03 void dispB();//函数原型 04 } 05 namespace A//创建名称空间A 06 { 07 void dispA();//函数原型 08 } <————————————————文件名:namespaceAB.cpp——————————-> 09 #include<iostream> 10 #include"namespaceAB.h" 11 using namespace std; 12 extern int num;//引用性声明外部变量 13 namespace B 14 { 15 int num=2;//B中声明的num 16 void dispB()//函数实现 17 { 18 A:dispA(); 19 } 20 } 21 namespace A 22 { 23 int num=1;//A中声明的num 24 void dispA()//函数实现 25 { 26 int num=3; 27 cout<<"dispA函数中的num:"<<num<<endl; 28 cout<<"A中的num:"<<A:num<<endl; 29 cout<<"B中的num:"<<B:num<<endl; 30 cout<<"外部的num:"<<:num<<endl; 31 } 32 } <————————————————文件名:example1509.cpp——————————-> 33 #include<iostream> 34 #include"namespaceAB.h" 35 using namespace std; 36 extern int num=0;//外部变量num的定义性声明 37 int main() 38 { 39 A:dispA();//调用名称空间A中的dispA函数 40 B:dispB();//调用名称空间B中的dispB函数 41 return 0; 42 }
输出结果如下所示。
dispA函数中的num:3 A中的num:1 B中的num:2 外部的num:0 dispA函数中的num:3 A中的num:1 B中的num:2 外部的num:0
【代码解析】代码第10和34行的“namespaceAB.h”起到了接口的作用,使得名称空间A和B中的函数在example1509.cpp中使用了#include"namespaceAB.h"在文件中可见,但由于变量只能声明一次,所以对变量的访问仍要求合理控制名称空间的定义顺序。
注意
经常所说的“库函数”,函数是调用的常用手段。