所谓non-local static 对象是指global对象、定义于namespace作用域内的对象、在class内、在file作用域内被定义为static对象.(函数内的则是local static对象).
所谓编译单元基本上指的是单一源码文件加上其所含入的头文件.
现在考虑一个问题,2个文件里面都含了一个non-local static 对象,某个文件内的non-local static对象初始化的时候需要另一个文件里面的non-local static 对象,它所用到的这个对象可能尚未被初始化,因为C++对"定义于不同编译单元内定义之non-local static 对象"的初始化顺序并无明确定义.
/*file1.cpp*/
class FileSystem{
public:
std::size_t numDisks()const;
};
extern FileSystem;//non-local static 对象
/*file2.cpp*/
class Directory{
public:
Directory();
}
Directory::Directory(){
std::size_t disks = tfs.numDisks();//使用file1.cpp里的non-local static 对象
}
然后客户创建了一个Directory对象,这时候麻烦就来了.
Directory tempDir();
因为C++对"定义于不同编译单元内定义之non-local static 对象"的初始化顺序并无明确定义,所以这样的结果也是未定义的.
解决方法:将每个non-local static对象搬到一个函数里面成为local static 对象.
/*file1.cpp*/
class FileSystem{
public:
std::size_t numDisks()const;
};
FileSystem & tfs(){
static FileSystem fs;
return fs;
}
因为C++保证,函数内的local static对象会在"该函数被调用期间""首次遇上该对象的定义式"的时候被初始化,所以用函数替换non-local static 对象就得到了保证.