开发大型程序时,常引用多个第三方库,若命名没有规范好,不同库可能因宣告、定义了名称相同的变量或函数,导致 compile 或 link error。有鉴于此,C++ 提供了 namespace 机制,让程序可以层层划分不同的 namespace 以放置变量、函数与自定义的类型。
假设现在有两个研究室, Computer Vision Lab (CVLab) 与 Image Processing Lab (IMLab),各自在开发一套图像处理的库,由于功能类似,将来发生命名冲突的可能行也高,事先可以用 namespace 规划命名来避免。我们先从 CVLab 的库看起:
// CVLabImage.h
#ifndef CVLAB_IMAGE_H
#define CVLAB_IMAGE_H
namespace cvlab
{
struct Image
{
unsigned long* pixels;
int width;
int height;
};
inline int GetSize(const Image* img) { return img->width * img->height; }
void ReadFromFile(Image* img, const char* filename);
namespace image_processing
{
void Desaturate(Image* img);
void HistogramEqualization(Image* img);
}
namespace face_detection
{
struct FacePattern
{
// ...
};
bool IsCorrectFace(const Image* img,
const FacePattern& fp);
}
} // namespace cvlab
#endif
C++ 支持 nested namespace,让程序做更细致的命名分类,故上面的范例中,cvlab namespace 下,又定义了 image_processing 与 face_detection 两个 namespace,除了让功能分类更明显,也避免这两个 namespace 内有同名导致冲突。
下面是 cpp 文件的实现。由于本文旨在说明 namespace 语法,故再次省略实现细节,仅说明如何取用 namespace 里的名称。在 namespace 外取用名称时,语法必须以