c++ - 静态初始化顺序失败 : same compilation unit?

标签 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;

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

最佳答案

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/

相关文章:

autotools - 在 Autoconf 测试中编译多个源文件

c++ - std::thread::hardware_concurrency 和静态初始化

c++ - 如何设置线程和子线程之间的信号/槽连接?

c++ - 使用 gcc 4.6.1 通过 mex 启用 AVX 指令

c++ - 从对象到第一个成员的 reinterpret_cast

c++ - 在 C++ 中重现静态初始化顺序失败

c++ - g++错误:word64没有命名类型

c++ - 哪个控制结构的时间复杂度较低?

c++ - 静态初始化顺序失败