gpt4 book ai didi

C++ 全局初始化顺序忽略依赖关系?

转载 作者:IT老高 更新时间:2023-10-28 22:16:07 26 4
gpt4 key购买 nike

我认为我的问题最好用代码来描述:

#include <stdio.h>

struct Foo;

extern Foo globalFoo;

struct Foo {
Foo() {
printf("Foo::Foo()\n");
}

void add() {
printf("Foo::add()\n");
}

static int addToGlobal() {
printf("Foo::addToGlobal() START\n");

globalFoo.add();

printf("Foo::addToGlobal() END\n");

return 0;
}
};

Foo globalFoo;

int dummy = Foo::addToGlobal();

int main() {
printf("main()\n");

return 0;
}

以上打印(使用 gcc 4.4.3):

Foo::Foo()
Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
main()

这是我所期望的,而且似乎合乎逻辑。

但是,当我交换以下行时:

Foo globalFoo;
int dummy = Foo::addToGlobal();

进入这个:

int dummy = Foo::addToGlobal();
Foo globalFoo;

程序输出以下内容:

Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
Foo::Foo()
main()

似乎 Foo 的实例方法正在使用尚未构造的实例调用!像在全局范围内移动变量声明这样简单的事情正在影响程序的行为,这让我相信(1)全局变量的初始化顺序没有定义,(2)全局变量的初始化顺序忽略所有依赖项。这个对吗?是否可以确保在初始化 dummy 之前调用了 Foo 的构造函数?

我要解决的问题是静态填充项目存储库(Foo 的静态实例)。在我目前的尝试中,我正在使用一个宏(除其他外)创建一个全局变量(在匿名命名空间中以避免名称冲突),其初始化会触发静态初始化。也许我从错误的角度解决了我的问题?有更好的选择吗?谢谢。

最佳答案

(1) the order of initialization of globals is not defined

全局变量在单个翻译单元中(源文件)按照它们的定义顺序进行初始化。

未指定不同翻译单元中全局变量的初始化顺序。

(2) the order of initialization of globals ignores all dependencies

没错。

Is it possible to make sure the constructor of Foo is called before initializing dummy?

是的,如果 before dummy 定义了 globalFoo 并且它们在同一个翻译单元中。

一种选择是有一个指向全局实例的静态指针;在进行任何动态初始化之前,此类指针将被初始化为 null; addToGlobal 然后可以测试指针是否为空;如果是,那么它是第一次使用全局并且 addToGlobal 可以创建全局 Foo

关于C++ 全局初始化顺序忽略依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3746238/

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