gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:40 24 4
gpt4 key购买 nike

我有一个奇怪的问题,

在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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com