C 无需使用匿名名称空间即可实现内部链接

C++ achieve internal linkage without using anonymous namespaces

本文关键字:空间 可实现 内部 链接      更新时间:2023-10-16

我一直在阅读有关宣布匿名名称空间以实现较低链接时间的信息。

但是,我已经读到不建议在标题文件中声明匿名名称空间:

在标题文件中定义了未命名的名称空间时,它可能会导致令人惊讶的结果。由于默认的内部链接,每个翻译单元将定义其自己的唯一实例在该翻译单元中使用的未命名名称空间的成员。这可能会导致意外的结果,膨胀由于违法行为(ODR(而导致的可执行文件或无意中触发不确定的行为。

以上是从下面的链接中提取的引用,其中有几个匿名名称空间的意外行为的示例:https://wiki.sei.cmu.edu/confluence/display/cplusplay/dcl59-cpp. do not define define define an unnamed namef namednamed namespace in a in header header file

所以,我的问题是:

上述问题仅适用于匿名名称空间变量,而不是方法。是的吗?

使用静态关键字将内部链接与变量强制内部链接时会出现相同的问题吗?如果是这样,还有其他方法可以安全地实现这一目标吗?

上述问题仅适用于匿名名称空间变量,而不是方法。是的吗?

提到的问题发生在匿名名称空间内的任何事情中。

使用静态关键字将内部链接与变量强制内部链接时会出现相同的问题吗?

也发生了同样的事情。

如果是这样,还有其他方法可以安全地实现这一目标吗?

没有。

如果将包含在不同的翻译单元中的标头文件中,将很快或以后发生。如果任何具有外部链接的实体在其定义或声明中使用内部链接中的一个实体之一。

,您将很快遇到问题。

在匿名名称空间内声明的任何实体,那些声明为静态和非前方const变量具有内部链接。

据称您是您所在的2个部分解决方案:

  • 内联变量和函数可以在mutliple翻译单元内显示其定义,因此可以安全地在标题文件中定义它们。

  • 如果您要寻找的内容不是要在库外面进行名称visibles,请在私人标头中定义它们,并将其应用于它们的可见性属性([[gnu:visibility("hidden")]]或无__dllexprot,MSVC(