gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:21:33 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com