gpt4 book ai didi

c++全局变量的初始化顺序

转载 作者:行者123 更新时间:2023-11-30 00:59:57 25 4
gpt4 key购买 nike

这是否可移植或至少可以安全地与 g++ 一起使用?

#include <iostream>
#include <vector>

struct c {};
std::vector<c*> v;
struct i : c { i () { v.push_back (this); } } a, b, c;

int main () {
std::cout << v.size () << "\n"; // outputs 3 with g++
}

编辑:

好吧,事实证明我需要的有点难:与模板相同的代码:

#include <iostream>
#include <vector>

template < typename T > struct c {};
template < typename T > struct cv { static std::vector<c<T>*> v; };
template < typename T > std::vector<c<T>*> cv<T>::v;
template < typename T > struct i : c<T> { i () { cv<T>::v.push_back (this); } };

cv<int> dummy; // even this won't initialize cv<int>::v
i<int> a, b, d;

int main () {
std::cout << cv<int>::v.size () << "\n"; // outputs 0 :-(
}

我如何解决这个问题才能像上面那样工作?

编辑 2:

这是一个丑陋的宏修复(我希望有更好的方法):

#include <iostream>
#include <vector>

template < typename T > struct c {};
template < typename T > struct cv;
#define INITCV(X) \
struct v##X { static std::vector<c<X>*> v; }; \
std::vector<c<X>*> v##X::v; \
template <> struct cv<X> { typedef v##X V; }
template < typename T > struct i : c<T> { i () { cv<T>::V::v.push_back (this); } };

INITCV(int);
i<int> a, b, d;

int main () {
std::cout << cv<int>::V::v.size () << "\n"; // outputs 3 again :-)
}

(顺便说一句,我应该发布一个新问题而不是编辑吗?)

最佳答案

翻译单元(通常对应于 .c 文件)中的全局变量按顺序初始化,因此这是安全的。你唯一会遇到的问题是你在不同的对象文件中有全局变量,这些对象文件相互依赖。

这在 §3.6.2/2 中的标准中有规定:

Variables with ordered initialization defined within a single translation unit shall be initialized in the order of their definitions in the translation unit.

只要未声明为 static,全局变量就会按顺序初始化。

关于c++全局变量的初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3514991/

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