因此,我使用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;我的问题是:这行得通吗?
发布于 2013-03-15 17:01:57
所以我有这样的想法,把所有这些冲突的情况转移到一个单独的.cpp文件中,按照它们的依赖关系排序。
这是一个您需要为其他部分中的代码更新的文件,也是您需要手动跟踪和保持最新的代码中的一个依赖项(基本上是bugs的来源)。
别干那事。
可以通过使用静态函数来强制静态初始化的顺序:
/* static */
int ExampleClass::EXAMPLEVAR()
{
static const int value = OtherExample::OTHEREXAMPLEVAR();
return value;
}这保证了将返回/初始化值,而不考虑初始化顺序依赖关系。
https://stackoverflow.com/questions/15427837
复制相似问题