前面说了命名空间的理论上的意义,现在就以现实的例子说明,命名空间的用法,命名空间用的基本原则或者说要求如下:
1、命名空间主要目的是圈定作用范围,避免命名冲突
2、不要在头文件中使用using引入其他命名空间
3、尽可能缩小引入命名空间范围,做到用什么引入什么
4、可以给命名空间取别名,也可以对命名空间嵌套
5、C++中尽量用匿名命名空间替代static
下面这个例子,包括了变量与函数在命名空间的用法,其引用是用了作用域解析操作符(::)的方法,这种方法不用using 声明或者 using编译指令,非常的直接而且好用,我非常喜欢用这种方法:
头文件:
root@mkx:~/learn/namespace1# cat globalData.h
namespace globalData{
extern int max ;
extern int min ;
int max1(const int *a, int size);
int min1(const int *a, int size);
}
源代码文件
root@mkx:~/learn/namespace1# cat globalData.cpp
#include "globalData.h"
namespace globalData{
int min = 0;
int max = 100;
int max1(const int * data, int size)
{
int i = 0;
int result = data[0];
for(i = 1; i < size; i++)
{
if(result < data[i])
result = data[i];
}
return result;
}
int min1(const int * data, int size)
{
int i = 0;
int result = data[0];
for(i = 1; i < size; i++)
{
if(result > data[i])
result = data[i];
}
return result;
}
}
主函数代码文件
root@mkx:~/learn/namespace1# cat test1.cpp
#include <iostream>
#include "globalData.h"
using std::cout;
using std::endl;
int main()
{
int data[] = {5, 4, 9, 3, 1, 10};
const int dataSize = sizeof(data)/sizeof(data[0]);
cout<<"Min int is "<<globalData::min1(data, dataSize)<<endl;
cout<<"Max int is "<<globalData::max1(data, dataSize)<<endl;
cout<<"min is "<<globalData::min<<endl;
cout<<"max is "<<globalData::max<<endl;
}
运行情况
root@mkx:~/learn/namespace1# g++ globalData.cpp test1.cpp -o test1
root@mkx:~/learn/namespace1# ./test1
Min int is 1
Max int is 10
min is 0
max is 100
root@mkx:~/learn/namespace1#