我有一个 C++ 项目,其中有const string
两个.o
文件中的常量,其中一个文件中的常量使用另一个文件中的值进行初始化。这曾经可以正常工作,但现在我使用的是更新的编译器,我一启动程序就会遇到段错误,我已经将它跟踪到依赖常量的初始化。
最小等效示例:
mystruct.h:
#include <string>
struct mystruct {
static const string myconst;
}
mystruct.cc:
#include <mystruct.h>
const string mystruct::myconst = "a"
程序.cc:
#include <mystruct.h>
const string mydependentconst = mystruct::myconst + "b";
int main() {}
此代码有时会出现段错误,因为mystruct::myconst
在初始化时尚未mydependentconst
初始化。我已经通过使变量初始化独立(有效地,mydependenconst = "ab"
)来修复我的代码,但我想知道:它实际上是未定义的行为,我之前只是幸运吗?
我认为这归结为我是否可以期望我的.o
文件中的常量初始化的特定顺序,或者我是否必须假设该顺序是未指定的。
请注意,我在mystruct::myconst
任何地方使用内部函数都没有问题,我只是在prog.cc
.
背景:这发生在一个有 15 年历史的 C++ 项目(使用g++
with -std=gnu++98
)中,我正试图在更新的操作系统上恢复。它在 CentOS 6 上运行良好,现在我正在修复它以在 CentOS 7 上运行,接下来我也会做更新的操作系统。