不同编译单元内定义之non-local static 对象

所谓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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值