所以我正在使用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;
我的问题是:这会有用吗?
答案 0 :(得分:7)
所以我有这个想法,将所有这些冲突的情况转移到依赖于它们的单独的.cpp文件中。
这将是您需要为其他部分中的代码更新的文件,以及您需要手动跟踪并保持最新的代码中的依赖项(基本上是错误的来源)。
不要那样做。
可以强制使用静态函数来强制静态初始化的顺序:
/* static */
int ExampleClass::EXAMPLEVAR()
{
static const int value = OtherExample::OTHEREXAMPLEVAR();
return value;
}
这保证了将根据初始化顺序依赖性返回/初始化值。