【发布时间】:2018-12-24 18:04:14
【问题描述】:
这是this question的后续行动。
正如答案中的 cmets 所述:
内联变量具有以下属性 - 它在每个翻译单元中具有相同的地址。 [...] 通常你通过在 cpp 文件中定义变量来实现这一点,但是使用 inline 说明符你可以在头文件中声明/定义你的变量,并且每个使用这个内联变量的翻译单元都使用完全相同的对象。
另外,从答案本身来看:
虽然该语言不保证(甚至不提及)跨共享库边界使用此新功能时会发生什么,但它确实适用于我的机器。
换句话说,当涉及共享库时,内联变量是否保证跨边界唯一并不清楚。有人凭经验证明它在某些平台上有效,但它不是正确的答案,它可能会破坏其他平台上的一切。
当跨边界使用内联变量时,它的唯一性是否有任何保证,或者它只是一个我不应该依赖的实现细节?
【问题讨论】:
-
C++ 语言标准根本不知道诸如“共享库”之类的任何概念。因此,这是您的平台必须提供的保证。
-
@BoBTFish 这看起来像是一种精巧的表达方式 - 不,它不是。 :-) 如果您可以将其放在答案中并添加一些额外的细节,我们将不胜感激。谢谢。
-
@skypjack 每个链接器都确保内联变量的唯一性,否则实现不符合要求。内联变量的问题与内联函数本地的静态变量之一完全相同。这些局部静态变量的定义唯一性问题早就解决了。这被称为模糊链接 here
-
这里来自一位非常可靠的作者的原始论文解释了同样的事情:open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4424.pdf
-
@ArneVogel 如果你能做到,这将是非常有启发性的,至少对我来说是这样。
标签: c++ shared-libraries language-lawyer c++17 inline-variable