gpt4 book ai didi

c++ - 静态初始化惨败 - 故意的

转载 作者:太空狗 更新时间:2023-10-29 21:06:55 24 4
gpt4 key购买 nike

只是为了好玩,我正在研究静态对象的动态初始化顺序。在文件名 t.h 中,我输入了

struct T {
static std::vector<std::string> me;
static int add(std::string s) { me.push_back(s); return me.size(); }
};

(加上 vector 和字符串所需的标题。)“std::vector T::me”在 t.cpp 中。文件 main.cpp 打印出 T::me 中的值:

#include "t.h"
#include <iostream>
using namespace std;

int main()
{
T::me.push_back("main");
cout << "T::me.size()=" << T::me.size() << endl;
for (unsigned i = 0; i<T::me.size(); ++i) {
cout << i << "-" << T::me[i] << endl;
}
return 0;
}

接下来,我创建“a.cpp”并将以下内容放入其中:

#include "t.h"

int a = T::add("a");

根据需要使用“b”和“c”对文件 b.cpp 和 c.cpp 执行类似操作。使用 g++ *.cpp 编译,然后运行 ​​./a.out。从编译单元到编译单元的静态初始化顺序是未指定的。在我的例子中,它始终按相反的字母顺序排列。我得到:3 - 丙2 - 乙1 - 一个0 - 主要

目前没有问题。

现在我像创建 a.cpp 一样创建 u.cpp,但使用“u”。重新编译/重新运行,“u”没有出现在列表中。

是因为我从来没有提到过你吗?我从未引用过 a、b、c,但我更改了 main:

#include "t.h"
#include <iostream>
using namespace std;

extern int u;

int main()
{
cout << "u=" << u << endl;
T::me.push_back("main");
cout << "T::me.size()=" << T::me.size() << endl;
for (unsigned i = 0; i<T::me.size(); ++i) {
cout << i << "-" << T::me[i] << endl;
}
return 0;
}

程序打印出“u=2”,但“u”不在列表中。你不应该使用之前被动态初始化,因此,T::me 已经更新为包含“u”吗?我认为应该有比 u 在字母表中位于 t 之后更好的解释。

最佳答案

我知道了。很简单,真的。T::me 是根据 C++ 规则静态初始化为零的。但是,有一个构造函数可以动态运行。无法保证该构造函数何时运行。显然 - 在这种情况下 - 在 u 初始化后运行。

关于c++ - 静态初始化惨败 - 故意的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6348725/

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