当前位置: 首页 > 知识库问答 >
问题:

全局变量的静态初始化是否在`main()`之前完成?

平俊茂
2023-03-14

C++标准1998的一些相关摘录:

int a = 1;
int main()
{
    cout << a << endl;
    return 0;
}

根据标准,静态初始化发生在动态初始化之前,动态初始化可能发生在输入main()之后。我的问题是:在输入main()之前,全局变量A是否初始化为1?然后,如果所有线程都是在输入main()之后创建的,则全局变量的静态初始化保证是线程安全的。

共有1个答案

贺皓
2023-03-14

标准规定,在调用任何函数之前,所有对象都要在同一个翻译单元(也就是对应于单个源文件的对象文件)中初始化。在您的示例中,它们看起来像是在同一个文件中,因此A将在调用main()之前初始化。

标准允许在运行时加载DLL的情况下进行延迟初始化。如果允许代码的运行时链接,就不能说所有的东西都在main()之前初始化。

 类似资料:
  • 问题内容: 我想知道为什么默认情况下C,C ++和Java中的确切静态变量初始化为零?为什么对局部变量不是这样? 问题答案: 为什么要对静态变量进行确定性初始化而对局部变量不进行初始化? 了解如何实现静态变量。 它们的内存在链接时分配,并且它们的初始值也在链接时提供。 没有运行时开销。 另一方面,用于局部变量的内存是在运行时分配的。堆栈必须增长。你不知道以前在那里。如果需要,可以清除该内存(将其清

  • 问题内容: 如何在Java中初始化类的私有静态成员。 尝试以下操作: 但是在创建类A的第二个对象然后调用f1()时,我得到了空指针异常。 问题答案: 初始化静态成员的首选方法是(如上所述) 或者对于更复杂的初始化代码,您可以使用静态初始化程序块:

  • 当我在Inno Setup脚本的< code>[Code]部分(Pascal脚本)声明一个全局变量时,它是否自动初始化为零/空值?还是必须显式初始化它(例如在< code>InitializeSetup事件函数中)? 根据我的经验,变量是零初始化的。不过,我不确定我是否只是运气不好。 我已经完成了10.000次测试代码迭代。全局变量(或各种类型、整数、字符串、指针)始终为零初始化。

  • 问题内容: 我有以下代码: 这给了我以下错误: 解析错误:语法错误,在第19行的/home/user/Sites/site/registration/inc/registration.class.inc中出现意外的’(’,期待’)’ 所以,我想我做错了什么…但是如果不那样做怎么办?如果我用常规字符串更改mktime内容,它将起作用。所以,我知道我能做到这一点 的那种 像.. 有人有指针吗? 问题答

  • 问题内容: 我想知道静态变量何时初始化为其默认值。加载类时,先创建(分配)静态变量,然后执行静态初始化程序和声明中的初始化是否正确?在什么时候给出默认值?这导致前向参考的问题。 另外,如果你可以参考“ 为什么没有及时初始化静态字段?”这一问题进行解释,尤其是Kevin Brock在同一网站上给出的答案。我不明白第三点。 问题答案: 从请参阅Java静态变量方法: 它是一个属于类而不属于对象(实例)

  • 问题内容: 当我运行此代码时,答案是1,我想应该是2。初始化的顺序和每一步中k的值是什么? 编辑1:作为后续的“ k设置为默认值”,那么为什么下一个代码不能编译?出现错误“在定义字段之前无法引用它”。 编辑2:出于某种我不知道的原因,它^可以在其“ Test.k”代替“ k”时使用。 感谢所有的答案。这将满足:D 问题答案: 它们按照您编写它们的顺序执行。如果代码是: 然后输出变为2。 初始化的顺