|
|
发表于 2007-1-30 01:33:00
|
显示全部楼层
Re:无名的命名空间有啥用?
我再来个例子。
在库里有class A和class B,Class A有个Static Member functions用来对Class A进行初始化。在Class B中掉用Class A,所以要保证在使用Class B的时候 Class A已经正确初始化了。那么可以在写程序的时候显式的对A进行初始化,但是这种方式太累赘,容易犯错误,另一种方式如下:
// class A header file
class A {
.... // Class A member and interface
// Helper class
class AInitHelper {
static int _initRefCount;
AInitHelper() {
if( _initRefCount++ == 0 )
... // Class A init here
};
~AInitHelper() {
... // Deinit here
};
};
};
namespace {
A::AInitHelper __init;
};
在class B 的cpp 文件中
#include "a header"
这个时候由于是unnamed namespace,所以会单独建立一个AInitHelper __init的拷贝。
然后 int AInitHelper::_initRefCount = 0;
这个时候由于__init是全局,那么必然先于class B进行初始化。由于在unnamed namespace里,所以即使其他file include A的header,也会有不同的__init,所以可以保证每个include A的module,都会进行_init的初始化,从而检查class A是不是已经初始化了。保证正确的初始化顺序。
这是STL中解决模块之间初试化依赖关系的标准方案.
|
|