所以我正在使用 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;
我的问题是:这行得通吗?
最佳答案
So I have this idea of moving all these conflicting situations in a separate .cpp file ordered by their dependencies.
这将是一个您需要为其他部分的代码更新的文件,以及您需要手动跟踪和保持最新的代码中的依赖项(基本上是错误的来源)。
不要那样做。
可以通过使用静态函数来强制执行静态初始化的顺序:
/* static */
int ExampleClass::EXAMPLEVAR()
{
static const int value = OtherExample::OTHEREXAMPLEVAR();
return value;
}
这保证了值将根据初始化顺序依赖关系被返回/初始化。
关于c++ - 静态初始化顺序失败 : same compilation unit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15427837/