Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态初始化顺序失败是否适用于块范围静态变量?_C++_C++14_Language Lawyer - Fatal编程技术网

C++ 静态初始化顺序失败是否适用于块范围静态变量?

C++ 静态初始化顺序失败是否适用于块范围静态变量?,c++,c++14,language-lawyer,C++,C++14,Language Lawyer,这个问题与本主题中的问题非常相似,我找不到明确的答案,因为几乎每个示例都包含两个相互依赖的名称空间范围实例。例如: a、 水电站 a、 cpp b、 水电站 b、 cpp main.cpp int main() { myFunc(); } 假设MyGlobal和mystaticolocal都有一些非平凡的构造函数,因此在动态初始化期间初始化。 我知道编译器可以推迟动态初始化,直到实际使用变量。但是如果它根本不在同一个TU中使用呢?编译器什么时候决定初始化它 另一个问题:如果global是常量初

这个问题与本主题中的问题非常相似,我找不到明确的答案,因为几乎每个示例都包含两个相互依赖的名称空间范围实例。例如:

a、 水电站

a、 cpp

b、 水电站

b、 cpp

main.cpp

int main() { myFunc(); }
假设
MyGlobal
mystaticolocal
都有一些非平凡的构造函数,因此在动态初始化期间初始化。 我知道编译器可以推迟动态初始化,直到实际使用变量。但是如果它根本不在同一个TU中使用呢?编译器什么时候决定初始化它

另一个问题:如果
global
是常量初始化的,我假设没有问题。但是,
s
是否也可能是常量初始化的(并且仍然以某种方式依赖于
全局的
),或者这是不可能的


如果标准中有一些引用,我们将不胜感激:)

函数本地
静态
变量是在控件第一次到达其声明时创建的。在您的情况下,它将在输入
main
之后发生,此时
global
肯定已初始化

s
是否也可能是常量

…并且仍然以某种方式依赖于
global

是,仅当
global
constexpr


如果一个变量是常量初始化的,就没有什么可担心的了。编译时没有静态初始化顺序失败。

函数作用域中的静态变量在第一次调用函数时初始化。此处不相关,但初始化是线程安全的。你还有一些。@TedLyngmo谢谢我不知道这个标签,补充道:D@super我的问题不是何时初始化
MyLocalStatic
,而是“如何保证
MyGlobal
在初始化之前(如果有的话)进行初始化,它在第一次调用函数时被初始化的事实应该告诉您,全局变量保证在它被初始化之前被初始化。因此,即使您没有询问MyLocalStatic是何时初始化的,我的评论仍然回答了您的问题。@super标准说,具有静态存储持续时间的非局部变量的动态初始化是否在main的第一个语句之前完成,这是实施定义的。那么,标准的哪一部分构成了您所谈论的保证呢?仅作为旁注:独立于静态初始化顺序的失败,仍然有很小的机会搞乱事情:外部链接情况(UB)的多个转换单元中常数变量的多个不同定义@HolyBlackCat您可以看到,该标准似乎不同意“
global
肯定已初始化”(或者我读错了?):是否在
main
的第一个语句之前完成具有静态存储持续时间的非局部变量的动态初始化,是由实现定义的。如果初始化延迟到
main
的第一条语句之后的某个时间点,则初始化应在与待初始化变量定义在同一转换单元中的任何函数或变量的第一次odr使用(3.2)之前进行。在这种情况下,odr使用是否也适用于
extern
变量?但是SIOF应该没有任何问题吗?
const MyGlobal global;
void myFunc();
extern const MyGlobal global;
class MyLocalStatic
{
    public:
    MyLocalStatic() { /* do something with global */ }
    
};

void myFunc()
{
    static MyLocalStatic s;
}
int main() { myFunc(); }