我一直在使用匿名命名空间来存储本地数据和函数,并想知道数据何时被初始化?是应用程序以与静态数据相同的方式启动还是依赖于编译器?例如:
// foo.cpp #include "foo.h" namespace { const int SOME_VALUE = 42; } void foo::SomeFunc(int n) { if (n == SOME_VALUE) { ... } }
问题产生于使一些代码线程安全.在上面的例子中,我需要确定SOME_VALUE
在第一次调用SomeFunc之前初始化.
C++标准,3.6.2/1:
使用常量表达式进行零初始化和初始化统称为静态初始化; 所有其他初始化是动态初始化.具有使用常量表达式(5.19)初始化的静态存储持续时间的POD类型(3.9)的对象应在任何动态初始化发生之前初始化.在同一翻译单元的命名空间范围内定义并动态初始化的静态存储持续时间的对象应按其定义出现在翻译单元中的顺序进行初始化.
这实际上意味着,即使另一个翻译单元从外部调用SomeFunc函数,您的SOME_VALUE常量也将始终正确初始化,因为它是用常量表达式初始化的.
早期调用函数(在main之前)的唯一方法是使用动态初始化初始化对象.但到那时,根据标准报价,您的POD变量的初始化已经完成.