繁体   English   中英

为什么 boost lib 有外部链接,而不是内部链接? (仅标题链接的最佳实践)

[英]Why does the boost lib have external linkage, not internal? (Best practice of linkage for header-only)

Boost 库将函数定义为以下样式

namespace boost::io::detail {
    template<class Iter, class Facet>
    Iter wrap_scan_notdigit(...) {
        // snip
    }
}

据我了解,function 具有外部链接,因为

  • 命名空间在全局 scope 上,未命名
  • function 未声明为“静态”

根据我的经验,header 上的外部链接经常会导致 ODR 违规。 例如,两个不同的翻译单元可能包含不同的版本; 当您使用 3rd-party 时,通常会发生这种情况 。所以 .a(静态)库。

ODR 违规的关键问题是 NDR:编译器/链接器不必发出错误,但在极少数情况下它可能会生成执行时错误。

内部联动可以避免这个问题。

所以我的问题是(与标题相同):

  • 为什么boost的链接是外部的,而不是内部的?
  • (上面概括)我应该如何为我的仅标题库设置链接?

header 上的外部链接经常导致 ODR 违规。

仅当标头写得不好时(或者如果定义依赖于预处理器指令,则可能在使用不当时)。

外部链接减少了代码膨胀,因为每个程序只需要每个 function 的一个副本,而不是每个翻译单元一个副本。

当您使用 3rd-party.so 库时,通常会发生这种情况。

库 object 代码不应从仅标头库中导出符号。 仅标头的要点是它无需链接到库 object 代码即可使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM