c++ - 为什么 boost lib 有外部链接,而不是内部链接?(仅标题链接的最佳实践)
问题描述
Boost 库将函数定义为以下样式;
namespace boost::io::detail {
template<class Iter, class Facet>
Iter wrap_scan_notdigit(...) {
// snip
}
}
据我了解,该功能具有外部联系,因为
- 命名空间在全局范围内,而不是未命名的
- 函数不是“静态”声明的
根据我的经验,标头上的外部链接通常会导致 ODR 违规。例如,两个不同的翻译单元可能包含不同的版本;当您使用 3rd-party 时,通常会发生这种情况。所以.a(静态)库。
ODR 违规的关键问题是 NDR:编译器/链接器不必发出错误,但在极少数情况下它可能会生成执行时错误。
内部联动可以避免这个问题。
所以我的问题是(与标题相同):
- 为什么boost的链接是外部的,而不是内部的?
- (上面概括)我应该如何为我的仅标题库设置链接?
解决方案
标头上的外部链接通常会导致 ODR 违规。
仅当标头写得不好时(或者如果定义依赖于预处理器指令,则可能在使用不当时)。
外部链接减少了代码膨胀,因为每个程序只需要每个函数的一个副本,而不是每个翻译单元一个副本。
当您使用 3rd-party .so 库时,通常会发生这种情况。
库对象代码不应从仅标头库中导出符号。仅标头的要点是它无需链接到库对象代码即可使用。
推荐阅读
- entity-framework - 实体框架空闲会导致延迟吗?
- sql - 将十六进制转换为字符串
- php - 从 IBM Cloud Functions 调用时,PHP SDK 未向 Sentry 发送错误
- google-api - Drive Api v3:更改监视请求 TeamDriveId 被忽略?
- android - 主题/样式/文本外观,哪个先例?
- tsql - 列 Data_Type 的 SQL 表达式检查
- php - Woocommerce 结帐后注销用户
- python - How to stop a function with another function ? (in python)
- android - Unity 在 Android 上启动游戏时会根据纵横比进行拉伸
- angular - “X”类型的参数不能分配给“字符串”类型的参数