【发布时间】:2016-08-11 07:16:55
【问题描述】:
我希望在初始化静态字段 (#B) 之前调用全局变量的初始化 (#A)。
目前,一些静态字段在全局变量之前初始化。
GridUtil.h
class GridUtil{
static Vec4* bPtr_; //will be filled
static void initGridCalculationCache();
static class _init //helper class
{
public:
_init() {
static_iniAll();
}
} _initializer;
}
GridUtil.cpp
#include "GridUtil.h"
GridUtil::_init GridUtil::_initializer;// (Edit: This line is just added, thank Dietmar Kühl.)
Vec4 b[24]; //#A executed 3rd : No, this should be the first.
Vec4* GridUtil::bPtr_=b; //#B executed 1st
void GridUtil::initGridCalculationCache() {
//.... fill GridUtil::bPtr_ using complex computation //#C executed 2nd
}
结果
从调试来看,上述代码的执行顺序是:-
B->C->A
但我想要:-
A->B->C
我注意到如果将“Vec4”替换为“int”,执行顺序将是:-
A->B->C
目标是使用静态函数 (initGridCalculationCache) 设置数组中元素的值 (bPtr_),该函数将自动调用(由类 _init 帮助)。
如果不可能,正确的方法是什么?
【问题讨论】:
-
您是否尝试在包含 GridUtil.h 之前在 GridUtil.cpp 中声明全局变量,或者将其声明为静态?
-
你可以看到全局信息:isocpp.org/wiki/faq/ctors#static-init-order.
-
@wasthishelpful 谢谢!这是正确的答案,如果您愿意,您可以发布为答案。
-
@javaLover 哪一个?移动位置还是使其静止?
-
wasthishelpful 的评论可以解决我的问题“在包含 GridUtil.h 之前在 GridUtil.cpp 中声明你的全局变量”; N0un - 感谢您提供出色的链接
标签: c++ arrays static global-variables