首页 > 解决方案 > 什么时候在 C++ 中调用静态初始化

问题描述

我有一个包含三个源文件的 C++ 程序:

// main.cpp

auto return_value = managed_call(int value);


// managed.cpp

#include "private_impl.hpp"
int managed_call(int arg) {
   if (arg == 0)
      return private_func();
   else
      return arg;
} 



//private_impl.cpp

static some_type some_var = construct_static_object_might_blow();

int private_func() {
   ....
   return 42;
}

我的问题是关于静态对象的初始化private_impl.cpp:“什么时候发生?” 或更具体地说-是否private_func在调用该函数时才对其进行初始化?

更新

我实际上简化了这个例子。有问题的代码将作为 Python 扩展运行 - 即它是dlopen()关键的 init 步骤。这个SO问题原来是正确的。

标签: c++

解决方案


什么时候在 C++ 中调用静态初始化

我想您的意思是,何时初始化具有静态存储持续时间的变量。如果变量具有静态初始化,那会发生在其他任何事情之前。

如果变量具有动态初始化,则在静态初始化期间初始初始化为零。动态初始化的确切点是实现定义的。该变量将在第一次访问之前的某个时间点进行初始化 - 或该翻译单元 (TU) 中的任何其他变量 - 或在调用该 TU 中的任何函数之前。

是否仅在调用 private_func 函数时才初始化?

private_func无论是否被调用,它都可以被初始化。但是如果private_func被调用,那么变量将在函数调用之前的某个时间点被初始化。我不清楚初始化是否可以推迟到永远不会发生。

此SO 帖子中的相关标准报价。


推荐阅读