静态初始化顺序fiasco:相同的编译单元?

时间:2013-03-15 08:34:35

标签: c++ static-order-fiasco

所以我正在使用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;

我的问题是:这会有用吗?

1 个答案:

答案 0 :(得分:7)

  

所以我有这个想法,将所有这些冲突的情况转移到依赖于它们的单独的.cpp文件中。

这将是您需要为其他部分中的代码更新的文件,以及您需要手动跟踪并保持最新的代码中的依赖项(基本上是错误的来源)。

不要那样做。

可以强制使用静态函数来强制静态初始化的顺序:

/* static */
int ExampleClass::EXAMPLEVAR()
{
    static const int value = OtherExample::OTHEREXAMPLEVAR();
    return value;
}

这保证了将根据初始化顺序依赖性返回/初始化值。