【问题标题】:Is static variable guaranteed to be initialized when used by static methods in the same translation unit?静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?
【发布时间】:2017-08-29 03:00:16
【问题描述】:

我读到静态全局变量的动态初始化如果它们在同一个翻译单元中,则保证按照定义的顺序发生。那么我想知道当一个静态全局变量被同一个翻译单元中定义在它之后的静态方法使用时,是否保证它必须是动态初始化的。

//Foo.h
class Foo
{
public:
    Foo(int i) {m_i = i;}
    int m_i;
};

//X.h
class X
{
    static void doSth();
    static Foo foo;
};

//X.cpp
Foo X::foo(2);
void X::doSth()
{
    //Is it guaranteed that foo has been properly initialized here?
    std::cout << foo.m_i << std::endl;
}

【问题讨论】:

    标签: c++


    【解决方案1】:

    简短回答:不,全局初始化与静态方法无关。

    这里有一个简单的场景来说明原因:如果Foo 的构造函数调用doSth() 会怎样?

    如果您需要该保证,则需要使用函数范围的静态变量。

    【讨论】:

    • 感谢您的回答。我刚刚想出了一个简单的程序来尝试它,如果我只是更改传递给链接器的目标文件的顺序,那么 foo.m_i 的值确实是不确定的。您指出的简单场景也很棒且易于理解。谢谢。
    • @leolong 如果更改链接顺序会更改结果,则它们不在同一个翻译单元中。目标文件是单个翻译单元的输出。
    • @MarkRansom 因为在我的测试程序中,我从另一个 cpp 文件中定义的另一个静态对象的构造函数中调用了 doSth()。
    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2017-05-13
    • 2018-03-15
    • 2016-07-27
    相关资源
    最近更新 更多