簡體   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