[英]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 具有外部链接,因为
根据我的经验,header 上的外部链接经常会导致 ODR 违规。 例如,两个不同的翻译单元可能包含不同的版本; 当您使用 3rd-party 时,通常会发生这种情况 。所以 .a(静态)库。
ODR 违规的关键问题是 NDR:编译器/链接器不必发出错误,但在极少数情况下它可能会生成执行时错误。
内部联动可以避免这个问题。
所以我的问题是(与标题相同):
header 上的外部链接经常导致 ODR 违规。
仅当标头写得不好时(或者如果定义依赖于预处理器指令,则可能在使用不当时)。
外部链接减少了代码膨胀,因为每个程序只需要每个 function 的一个副本,而不是每个翻译单元一个副本。
当您使用 3rd-party.so 库时,通常会发生这种情况。
库 object 代码不应从仅标头库中导出符号。 仅标头的要点是它无需链接到库 object 代码即可使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.