为什么当c ++构造函数作为静态成员变量出现时未被调用?

A N*_*tar 5 c++ unix static constructor acc

我有一个奇怪的问题,

声明一个静态成员变量,其名称为A类中的B类。并在cpp文件中初始化。但是从未调用过B类的构造函数。我尝试使用一些小型测试,可以正常调用测试构造函数。所以这对于我们的生产系统来说很奇怪。

hpp中这样的代码:

class Test
{
    public:
    Test()
    {
        ofstream file("/tmp/wup.txt",ios::app);
        file << "wup in test" << endl;
        file.close();
    }
};

//## An extended personality
class TsdNAExtPersonality : public TsdNAPersonality{
public:

  TsdNAExtPersonality(
        s_gg62_personRec * gg62Header,
                   TsdNAFunctionType requiredFunctionType);
private:
  static Test test;

public:
  TsdNAExtPersonality( string * personalityFile, TsdNAFunctionType requiredFunctionType);
};
Run Code Online (Sandbox Code Playgroud)

在另一个cpp文件中,我使用

Test TsdNAExtPersonality::test;
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法,但是我发现所有方法都没有用。

  1. 没有将变量设置为成员变量,但设置为全局变量==>也无法输出
  2. 将成员变量更改为指针,并将初始化方式更改为使用new ==> no

环境是HP-UX,编译是aCC

所以我的问题是:

  1. 是否有任何编译选项会影响变量?换句话说,所有静态变量都不会被初始化。

  2. 从C ++标准开始,应该在加载库时调用它,对吗?

  3. 我使用相同的方式放置了另一个静态int值,可以对其进行初始化。但是类的构造函数没有被调用,很奇怪。

  4. 我的代码有什么错误吗?

Mik*_*our 5

从C ++标准开始,应该在加载库时调用它,对吗?

不可以。具有静态存储持续时间的对象的动态初始化可以保证在执行同一转换单元中定义的任何功能之前进行。如果没有这样的函数,或者您的程序从不调用它们,则无法保证它将被初始化。

我使用相同的方式放置了另一个静态int值,可以对其进行初始化。但是类的构造函数没有被调用,很奇怪。

一个int变量是静态初始化,该程序开始之前,只要它的初始化剂是恒定的。

是否有任何编译选项会影响变量?

我不知道,但您不熟悉您的平台。您可以通过在函数内对其进行作用域设置来对对象的创建进行更多控制:

static Test & test() {
    static Test test;
    return test;
}
Run Code Online (Sandbox Code Playgroud)

现在可以保证在第一次调用该函数时进行初始化。当然,您需要记住在某个时候调用它。