c++ - 为什么当它作为静态成员变量出现时没有调用c++构造函数?

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

在另一个 cpp 文件中我用

初始化
Test TsdNAExtPersonality::test;

我试过很多方法,但我发现所有的方法都没有用。

  1. 没有设置变量为成员变量而是全局变量==>也不能输出
  2. 将成员变量改成指针,初始化方式改成new ==> no

环境是HP-UX,编译是aCC

所以我的问题是:

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

  2. 按照C++的标准应该是在加载库的时候调用,对吧?

  3. 我用同样的方法放了另一个static int值,它可以被初始化。但是没有调用类构造函数,很奇怪。

  4. 我的代码有没有错误?

最佳答案

from the standard of C++ it should be called when the library was load, right?

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

I put another static int value using the same way, it could be initialized. but the class constructor is not called , very strange.

int 变量在程序启动之前被静态初始化,只要它的初始化器是常量。

is there any compile option will influence the variable ?

据我所知,我不熟悉你们的平台。您可以通过将对象的范围限定在一个函数中来让自己更好地控制对象的创建:

static Test & test() {
    static Test test;
    return test;
}

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

关于c++ - 为什么当它作为静态成员变量出现时没有调用c++构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18790849/

相关文章:

Java:具有静态方法的类的集合——如果静态接口(interface)方法不是方法,还有其他方法吗?

c++ - 没有运算符 "=="匹配这些操作数字符串

linux - Shell 脚本 While 循环

c++ - C++ 函数中指向静态 double 的指针数组

arrays - 如何初始化大多数值相同但某些值不同的静态数组?

unix - 一次中断所有 lerna --parallel 任务

c++ - C++14 中 for 循环中的并行网络下载

c++ - 使用 C++ 在 CAFFE 中设置输入层

c++ - 为什么不能将 void 传递给没有参数的函数?

linux - shell 脚本 (AIX) : Extracting OS and browser information from user agent string