c++ - 什么时候初始化匿名命名空间数据?

标签 c++ namespaces

我一直在使用匿名命名空间来存储本地数据和函数,想知道什么时候初始化数据?是当应用程序以与静态数据相同的方式启动时还是依赖于编译器?例如:

// 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:

Zero-initialization and initialization with a constant expression are collectively called static initialization; all other initialization is dynamic initialization. Objects of POD types (3.9) with static storage duration initialized with constant expressions (5.19) shall be initialized before any dynamic initialization takes place. Objects with static storage duration defined in namespace scope in the same translation unit and dynamically initialized shall be initialized in the order in which their definition appears in the translation unit.

这实际上意味着,即使另一个翻译单元从外部调用您的 SomeFunc 函数,您的 SOME_VALUE 常量也将始终正确初始化,因为它是用常量表达式初始化的。

尽早(在 main 之前)调用函数的唯一方法是在使用动态初始化初始化对象时。但到那时,根据标准报价,您的 POD 变量的初始化已经完成。

关于c++ - 什么时候初始化匿名命名空间数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/331068/

相关文章:

c++ - 从 fstream 读取整行,包括空格

c++ - 如何设置cmake,以便将txt文件作为资源添加到工作目录中?

javascript - 通过 jest (ts-jest) 使用命名空间测试 typescript 代码

c++ - 编译器能否将隐式声明的虚拟析构函数的实现放在一个单独的翻译单元中?

c++ - 程序的输出?

c++ - "True Polymorphism"的例子? (最好使用 Haskell)

c++ - 如何在两个不同的命名空间(但只写一次)中使用不同的命名空间实现来定义相同的头文件?

python - 在 Python 模块中隐藏中间计算

c# - 即使我引用了 System.XML,也找不到 XmlDocument 类型?

java - Java 项目中嵌入 BaseX 的 "No namespace declared for bin:bin"错误