自C ++ 17起,可以使用inline
关键字在标头中初始化全局变量和静态成员。虽然我了解了为什么需要保护函数中的静态变量(因为即使在多线程上下文中初始化也只应该发生一次),但我不明白为什么也要保护这些新的内联变量(您可以在此处看到:{{3} }。我认为无论如何,所有全局变量和静态成员的初始化都在程序执行的开始(甚至在main()
之前)进行,因此此时无需考虑多个线程。你能解释一下吗?
答案 0 :(得分:22)
每个包含定义并使用定义的文件都将尝试初始化变量。即使那是串行发生的,而不是同时发生的,您仍然需要一种将变量标记为已初始化的方法,以便只有第一次出现时才会对其进行初始化,而以后尝试对其进行初始化将不会执行任何操作。
此外,在<style>
.pointer{
cursor:pointer;
}
</style>
开始之前,您可以有多个线程。全局变量的构造函数(以及这些构造函数调用的函数)可以产生新的线程。
因此,您可以有多个代码段,都在main
之前执行,都试图初始化同一个变量。那就是守卫们的目的。