加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 静态初始化命令fiasco

发布时间:2020-12-16 05:47:59 所属栏目:百科 来源:网络整理
导读:在他的“C中思考”(第10章)中,Eckel介绍了杰里·施瓦茨(Jerry Schwarz)率先采用的技术来解决这一失败. 他说,如果我们要将x初始化为100并将y分配到200,并在所有翻译单元之间共享,我们创建一个如下所示的Initializer.h: extern int x;extern int y;class Init
在他的“C中思考”(第10章)中,Eckel介绍了杰里·施瓦茨(Jerry Schwarz)率先采用的技术来解决这一失败.
他说,如果我们要将x初始化为100并将y分配到200,并在所有翻译单元之间共享,我们创建一个如下所示的Initializer.h:
extern int x;
extern int y;
class Initializer {
   static int initCount;
   // if (initCount++ == 0) x = 100 & y = 200
   /* ... */
};
static Initializer init;

在实现文件中我们有

#include "Initializer.h"
int x;
int y;
int Initializer::initCount;

Eckel说“静态初始化(在实现文件中)会强制所有这些值为零”.

让我考虑以下情况:编译器在包含该标题的其他文件之后处理实现文件(这意味着x和y已经在该另一个文件中已经设置为100和200).编译器看到int x,那么它会做什么?它会将x和y设置为零,以消除初始化和以前文件中的所有可能的更改?但是如果这样做,initCount也将被设置为零,从而打破整个技术.

解决方法

But if it is true,and the compiler handles the implementation file after some another file,than it will set x and y to zero eliminating initialization and all possible changes in previous files?

我不知道这是什么意思.如果x和y在其他文件中定义,那么你有一个链接器冲突,程序根本就不会编译.

如果x,y和最重要的是Initializer :: initCount以这种方式实现,程序中将会有唯一的实例;它们有效地是全局的,并且在程序启动之前,在构造任何初始化程序之前(由于包含声明该类的静态实例的头)而被初始化为0).静态初始化程序的每个构造将首先检查是否由于if(initCount == 0)等构造了任何其他Initializers.

因此,要运行的第一个初始化器ctor(仍然在进入main之前)将设置所有三个值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读