大佬教程收集整理的这篇文章主要介绍了c – 静态初始化命令fiasco,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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也将被设置为零,从而打破整个技术.
@H_874_13@我不知道这是什么意思.如果x和y在其他文件中定义,那么你有一个链接器冲突,程序根本就不会编译.
如果x,y和最重要的是Initializer :: initCount以这种方式实现,程序中将会有唯一的实例;它们有效地是全局的,并且在程序启动之前,在构造任何初始化程序之前(由于包含声明该类的静态实例的头)而被初始化为0).静态初始化程序的每个构造将首先检查是否由于if(initCount == 0)等构造了任何其他Initializers.
因此,要运行的第一个初始化器ctor(仍然在进入main之前)将设置所有三个值.
@H_874_13@ @H_874_13@以上是大佬教程为你收集整理的c – 静态初始化命令fiasco全部内容,希望文章能够帮你解决c – 静态初始化命令fiasco所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。