静态初始化顺序失败:相同的编译单元
Static initialization order fiasco: same compilation unit?
所以我正在用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;
}
这保证了值的返回/初始化将尊重初始化顺序的依赖性。
相关文章:
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用 SCons 提取每个编译单元的编译时间
- 将 lambda 函数转换为另一个编译单元中的普通函数会缩短编译时间吗?
- 模板部分专用化和多个编译单元
- 编译单元之间共享的全局常量对象
- Visual studio是否强制将预编译的头文件包含在项目的所有编译单元中
- 每个编译单元是否只有一个未命名的命名空间
- 当(执行时间)>>>(编译时间)时,多个编译单元是否仍然值得?
- 将模板代码分解为单独的编译单元
- 如何在 Eclipse 中将我的项目从多个编译单元转换为单个编译单元
- cud(编译单元数据)数组值的意义是什么?
- 使用 extern 引用在不同编译单元中定义的函数
- 不是同一编译单元的变量的构造顺序
- 什么是LLVM中编译单元的正确抽象
- 如何更改编译单元的版本
- 在#include中获取当前编译单元名称
- 有没有一种方法可以在编译单元中隐藏C++类定义
- 是一个在C++中以不同编译单元多次编译的模板类
- 在不同的编译单元中使用不同的编译标志编译相同的头