1. 这里关心的问题是:涉及到至少两个源码文件,每一个内至少含一个non-local static对象。问题是:如果某一个编译单元内的某一个non-local static对象的初始化动作使用了另一编译单元内的某个non-local static对象,它使用的对象可能尚未被初始化,因为C++对“定义于不同编译单元内的non-local static对象”的初始化次序并无明确定义。
2. 代码示例
- Filesystem.h文件如下
#ifndef __FILESYSTEM__
#define __FILESYSTEM__
#include <iostream>
class FileSystem{
public:
FileSystem() :m_size(10){}
std::size_t numDisk() const
{
return m_size;
}
private:
std::size_t m_size;
};
static FileSystem tfs;
#endif // !__FILESYSTEM__
- Directory.h文件如下
#ifndef __DIRECTORY__
#define __DIRECTORY__
#include <iostream>
#include "filesystem.h"
extern FileSystem tfs;
class Directory{
public:
Directory()
{
m_size = tfs.numDisk();
printf("The file size is [%d]\n", m_size);
}
private:
std::size_t m_size;
};
static Directory tempDir;
#endif
- test.cpp文件如下
#include "Directory.h"
int main()
{
return 0;
}
那么输出是啥呢,并不是不确定因素,无论在linux还是windows上,多次输出都是:
The file size is [10]
也就是说,都是Filesystem.h文件先初始化。