首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >静态初始化顺序失败:相同的编译单元?

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

Stack Overflow用户
提问于 2013-03-15 16:34:35
回答 1查看 898关注 0票数 2

因此,我使用ANTLR构建了一个语法编译器,生成的一些代码如下所示:

代码语言:javascript
运行
复制
const int ExampleClass::EXAMPLEVAR = OtherExample::OTHEREXAMPLEVAR;

正如你所看到的,这符合“静态初始化顺序失败”的描述。

问题是这个项目的目标之一是生成的C++代码可以尽可能容易地用作进一步语法编译的基础。

这就是为什么“第一次使用时构造”范例在这种情况下可能是一个问题:很难区分静态变量或静态函数。

现在,我已经在几个场合读到,如果这些静态变量在单个编译单元中初始化,问题就不存在了。

因此,我有一个想法,将所有这些冲突的情况都转移到一个单独的.cpp文件中,按它们的依赖关系排序。

针对这些冲突情况生成的代码将如下所示:

代码语言:javascript
运行
复制
//StaticInitializations.cpp
#include "ExampleClass.h"
#include "OtherExample.h"
const int OtherExample::OTHEREXAMPLEVAR = 3; 
const int ExampleClass::CHANNEL_TYPE_TV = OtherExample::OTHEREXAMPLEVAR;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-15 17:01:57

所以我有这样的想法,把所有这些冲突的情况转移到一个单独的.cpp文件中,按照它们的依赖关系排序。

这是一个您需要为其他部分中的代码更新的文件,也是您需要手动跟踪和保持最新的代码中的一个依赖项(基本上是bugs的来源)。

别干那事。

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

代码语言:javascript
运行
复制
/* static */
int ExampleClass::EXAMPLEVAR()
{
    static const int value = OtherExample::OTHEREXAMPLEVAR();
    return value;
}

这保证了将返回/初始化值,而不考虑初始化顺序依赖关系。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15427837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档