MST

星途 面试题库

面试题:C++中全局变量初始化顺序相关基础问题

假设有两个全局变量 `int a;` 和 `double b;` 定义在不同的源文件 `source1.cpp` 和 `source2.cpp` 中,请问它们的初始化顺序是怎样的?如果 `a` 的初始化依赖于 `b` 的值,在不改变代码结构的情况下,如何确保 `a` 能获取到正确的 `b` 值?
40.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 初始化顺序
    • C++ 标准并没有明确定义不同源文件中全局变量的初始化顺序。这意味着 ab 的初始化顺序是不确定的,可能先初始化 a,也可能先初始化 b,这取决于编译器和链接器的实现。
  2. 确保 a 能获取到正确的 b 值(不改变代码结构)
    • 可以使用函数静态局部变量来延迟初始化。在 source1.cpp 中定义一个函数来获取 a 的值,在这个函数中使用静态局部变量来存储 a 的值,并在首次调用该函数时进行初始化。在初始化时可以确保 b 已经被初始化(因为在函数调用时,全局变量初始化应该已经完成)。示例代码如下:
    // source1.cpp
    #include "source2.h"
    int getA() {
        static int a = calculateABasedOnB();
        return a;
    }
    int calculateABasedOnB() {
        // 假设这里根据 b 计算 a 的值
        return static_cast<int>(getB() * 2);
    }
    
    // source2.cpp
    double b = 3.14;
    double getB() {
        return b;
    }
    
    • 通过这种方式,在首次调用 getA 函数时,a 会根据已经初始化的 b 的值进行正确初始化。