c++ 是否保证 header-initialized static const 成员跨编译单元和库共享单个实例?
Do c++ guarantee header-initialized static const member to share a single instance across compile units and libraries?
让我们考虑一个代码
header:
class uid
{
public:
uid () {++i; }
static int i;
};
class foo
{
public:
const static uid id;
}
来源:
static int uid::i = 0;
header 可以包含在多个源文件中,在编译器单元和库之间共享。
是否保证 foo::id
只有一个实例,foo::id::id()
会在 run-time 被调用一次,最重要的是 foo::id.i
在程序和它的库中到处都一样吗?另一方面,另一个共享的 header 可能有 bar
class 和它自己的 static const uid id
,预计与 foo
的不同。也有保障吗?如果是这样,实际存储 foo::id
符号的位置,尤其是在共享 (dynamic-linked) 库的情况下。
由于某些原因,c++ 禁用
class foo
{
public:
const static int id = create_uid(); // forbidden
}
只允许 compile-time const 初始化或在源文件中初始化。所以有一些理由禁用这种方法。
是的,这是保证。
该符号位于从定义 object 的源文件构建的翻译单元中。的确,这就是为什么我们必须将它定义为一个!
链接器确保项目中 header 副本的所有引用都与唯一定义匹配。
至于为什么 C++ 不允许您内联初始化静态成员:它可以,但在 C++98 中不行。为此你需要 C++17。
让我们考虑一个代码
header:
class uid
{
public:
uid () {++i; }
static int i;
};
class foo
{
public:
const static uid id;
}
来源:
static int uid::i = 0;
header 可以包含在多个源文件中,在编译器单元和库之间共享。
是否保证 foo::id
只有一个实例,foo::id::id()
会在 run-time 被调用一次,最重要的是 foo::id.i
在程序和它的库中到处都一样吗?另一方面,另一个共享的 header 可能有 bar
class 和它自己的 static const uid id
,预计与 foo
的不同。也有保障吗?如果是这样,实际存储 foo::id
符号的位置,尤其是在共享 (dynamic-linked) 库的情况下。
由于某些原因,c++ 禁用
class foo
{
public:
const static int id = create_uid(); // forbidden
}
只允许 compile-time const 初始化或在源文件中初始化。所以有一些理由禁用这种方法。
是的,这是保证。
该符号位于从定义 object 的源文件构建的翻译单元中。的确,这就是为什么我们必须将它定义为一个!
链接器确保项目中 header 副本的所有引用都与唯一定义匹配。
至于为什么 C++ 不允许您内联初始化静态成员:它可以,但在 C++98 中不行。为此你需要 C++17。