静态初始化顺序失败:相同的编译单元

Static initialization order fiasco: same compilation unit?

本文关键字:编译 单元 初始化 顺序 失败 静态      更新时间:2023-10-16

所以我正在用ANTLR构建一个语法编译器,生成的一些代码看起来像这样:

const int ExampleClass::EXAMPLEVAR = OtherExample::OTHEREXAMPLEVAR;

正如你所看到的,这符合"静态初始化顺序惨败"的描述。

问题是这个项目的目标之一是生成的c++代码可以尽可能容易地用作进一步语法编译的基础。

这就是为什么"首次使用时构造"范式在这种情况下可能是一个问题:区分静态变量或静态函数要困难得多。

现在我已经读过几次,如果这些静态变量在单个编译单元中初始化,问题就不存在了。

所以我有这个想法,把所有这些冲突的情况移动到一个单独的。cpp文件中,按照它们的依赖关系排序。

为这些冲突情况生成的代码如下所示:

//StaticInitializations.cpp
#include "ExampleClass.h"
#include "OtherExample.h"
const int OtherExample::OTHEREXAMPLEVAR = 3; 
const int ExampleClass::CHANNEL_TYPE_TV = OtherExample::OTHEREXAMPLEVAR;

我的问题是:这能行吗?

所以我有这个想法,把所有这些冲突的情况移动到一个单独的。cpp文件中,按照它们的依赖关系排序。

这将是一个你需要为其他部分的代码更新的文件,以及你需要手动跟踪和保持更新的代码中的依赖项(基本上是bug的来源)。

别那样做。

可以通过使用静态函数来强制静态初始化的顺序:
/* static */
int ExampleClass::EXAMPLEVAR()
{
    static const int value = OtherExample::OTHEREXAMPLEVAR();
    return value;
}

这保证了值的返回/初始化将尊重初始化顺序的依赖性。