4

我在 c++ 类的这些静态成员初始化方面遇到了麻烦。有关更多信息,请参阅我的代码。

来源

头文件.h

#ifndef HEADER_H
#define HEADER_H
#include <string>
using namespace std;
class Staff{ public: static string str;};
class Boss{ public: static string str;};
#endif

员工.cpp

#include "header.h"
string Staff::str = "(staff)";

老板.cpp

#include "header.h"
string Boss::str = "I call " + Staff::str;

主文件

#include <iostream>
#include "header.h"
int main(){cout << Boss::str << endl;}

这里有许多不同结果的编译代码:

预编译:

g++ -c boss.cpp
g++ -c staff.cpp
ar rcs lib.a boss.o staff.o
ar rcs rlib.a staff.o boss.o

编译、运行和结果:

g++ main.cpp staff.cpp boss.cpp ; ./a.out
==> I call (staff)
g++ main.cpp boss.cpp staff.cpp ; ./a.out
==> segmentation fault (core dumped)
g++ main.cpp lib.a ; ./a.out
==> segmentation fault (core dumped)
g++ main.cpp rlib.a ; ./a.out
==>segmentation fault (core dumped)

我想在编译时使用库存档而不是与巨型对象顺序混淆。帮我解决它们。

谢谢你。

4

2 回答 2

12

单独翻译单元中静态变量的初始化顺序未定义。您的两个源文件构成两个独立的翻译单元,每个翻译单元定义一个变量。分段错误可能发生在尝试使用尚未Staff::str初始化Boss::str时进行初始化时。Staff::str

要解决它,请将它们都定义在同一个翻译单元中:

#include "header.h"
string Staff::str = "(staff)";
string Boss::str = "I call " + Staff::str;

或者使它们的初始化相互独立:

std::string Staff::get_str() {
  return "(staff)";
}

string Staff::str = Staff::get_str(); 

string Boss::str = "I call " + Staff::get_str();

从您的前两个示例中,初始化顺序似乎与链接顺序有关,但您不能依赖它。

于 2012-08-11T03:36:53.513 回答
4

单独翻译单元中全局变量的初始化顺序未定义。您可以将它们包装在一个函数中以使其工作:

class Staff{ public: static & string str();};
class Boss{ public: static & string str();};

string & Staff::str()
{
  static string s = "(staff)";
  return s;
}

string & Boss::str()
{
  static string s = "I call " + Staff::str();
  return s;
}
于 2012-08-11T03:45:03.663 回答