[英]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.