2

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

我的问题是:这行得通吗?

4

1 回答 1

7

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

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

不要那样做。

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

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

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

于 2013-03-15T09:01:57.453 回答