父级的静态变量是否保证在子级的静态变量之前初始化?

Is parent's static variables guaranteed to be initialized before child's static variables?

本文关键字:静态 变量 初始化 是否      更新时间:2023-10-16

我有一个C 代码看起来像

parent.hpp

class Parent {
    static std::map<std::string, std::function<void()>> list;
}

parent.cpp

#include "Parent.hpp"
std::map<std::string, std::function<void()>> Parent::list;

child.hpp

#include "Parent.hpp"
class Child : Parent {
    static bool isRegistered = registerComponent();
    std::function<void(GameObject* go, void* arr)> add;
    static bool registerComponent();

child.cpp

#include "Child.hpp"
    static bool Child::isRegistered = registerComponent();
    std::function<void(GameObject* go, void* arr)> Child::add = []() {
        //do something
    }
    static bool Child::registerComponent() {
        if (add) {
            list["child"] = Child::add;
            return true;
        }
        else return false
    }

在我致电registerComponent()之前,list是否可以在初始化?我读过这篇文章何时初始化静态C 类成员?我认为不能保证,但我不是100%确定的。

不。您写它的方式,listChild的静态成员之间没有初始化保证的顺序。

保证的是,在其翻译单元中任何函数的任何功能中,静态数据是在任何用途之前初始化的静态数据。因此,如果您将registerComponent成为Parent的成员,那么父母班级和其子女之间的一切都会好起来的。

class Parent {
    static std::map<std::string, std::function<void()>> list;
  protected:
    // Implemented in the same TU where list is defined
    static bool registerComponent(std::string k, std::function<void()> v);
};

现在,任何调用registerComponent的儿童类都将使用定义list的翻译单元的函数,因此list肯定会在执行函数之前初始化。