所以我正在用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;
}
这保证了值的返回/初始化将尊重初始化顺序的依赖性。