首页 >后端开发 >C++ >C 中的静态初始化顺序惨败期间会发生什么?

C 中的静态初始化顺序惨败期间会发生什么?

Patricia Arquette
Patricia Arquette原创
2024-12-11 02:05:09326浏览

What Happens During Static Initialization Order Fiasco in C  ?

“静态初始化顺序惨败”谜团揭晓

当 C 程序中的多个文件包含依赖于静态变量的静态变量时,就会出现臭名昭著的“静态初始化顺序惨败”(SIOF)。彼此进行初始化。考虑以下示例:

// file1.cpp
extern int y;
int x = y + 1;

// file2.cpp
extern int x;
int y = x + 1;

问题:

  1. 在编译 file1.cpp 期间,编译器是否:

    • 分配存储空间y?
    • 初始化x?
  2. 在编译file2.cpp期间,编译器是否:

    • 为x分配存储?
    • 初始化y?
  3. 链接 file1.o 和 file2.o 时,如果首先初始化 file2.o,则:

    • x 收到初始值值 0?
    • x 仍然存在未初始化?

答案:

根据C标准(3.6.2“非本地的初始化”)对象"):

  1. a.编译器为 y.
    b.分配存储空间。 x 的存储,但初始化it.
  2. a.编译器为x分配存储。
    b.编译器为y分配存储,但初始化it.
  3. a. x 接收初始值 0.
    b. x 保持未初始化。

说明:

  • 第 1 步: x 和 y 在任何其他初始化之前都初始化为零。
  • 第 2 步: x 之一或者 y 是动态初始化的(标准没有指定哪个)。已初始化的变量接收值 1,因为另一个变量已零初始化。
  • 第 3 步: 然后动态初始化另一个变量,接收值 2。

以上是C 中的静态初始化顺序惨败期间会发生什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn