2013-03-01 76 views
2

這個問題出現在我實現我的靜態庫時。
我想檢查我的猜測並獲得有關在靜態庫中使用內聯函數的信息靜態庫。導入和導出內聯函數

  • 我的猜測是,靜態庫的iplementator不能在他的書房
    導出內聯函數由於在線聲明是由編譯器實現 (它是由編譯器是否通過在代碼段中放置代表 操作的低級命令,使得 操作不會被放置在導出/導入表和 中,因此不能由鏈接器處理,因此使內嵌函數 成爲函數內聯)不能是 由圖書管理員包含在c中附有靜態庫 的應用程序的代碼。我的邏輯正確嗎?

  • 我想這導入功能內嵌被允許,但我不知道它是如何實現,因爲它是compiler`s 的責任,但在鏈接狀態,只有圖書管理員,所以 這意味着它必須承擔一些動作爲了使 函數內聯。

+0

內聯函數將始終在頭文件中定義,因此編譯器無論如何都會看到它。 – 2013-03-01 14:12:09

回答

5
  1. 是的,內聯函數通常放在一個頭文件中,所以在函數使用的任何地方,函數體都可以直接被編譯器看到。這可讓編譯器評估是否在任何特定實例中爲函數生成內聯代碼。

  2. 這基本上不會出現 - 「內聯函數應在每個使用它的翻譯單元中定義。」 (§3.2/ 3)。這意味着,如果編譯器將內聯生成函數,則進入庫的內容是包含該函數代碼的內聯擴展的對象代碼。由於函數可能無法在每次使用時以內聯方式擴展,因此函數庫中通常還會定義函數,但該定義將用於(至少主要)像普通函數,而不是內聯擴展。

鏈接器也可以生成代碼。無論函數是否是語言標準的函數,並且在與使用函數相同或不同的翻譯單元中定義,鏈接器無論如何都可以爲其生成內聯代碼。

簡而言之,inline關鍵字對於典型的編譯器幾乎沒有影響,只要函數的代碼是否內聯生成。主要的(如果不是唯一的)效果是它改變了單定義規則 - 內聯意味着同一個函數的多個(相同)定義可以存在而不會引起問題。

1

您是否瞭解關鍵字inline - 您可以同樣使用替換。

內聯函數允許編譯,如果是這樣,選擇用實際代碼替換函數調用 - 不需要導出/導入。它在頭文件中定義。任何使用目標代碼的東西都需要這個頭代碼,因此編譯器會用實際的代碼替換函數調用。

1

在Visual C++上,您可以使用Microsoft的特定行爲,並使用__declspec(dllexport) inlineextern inline導出/導入內聯函數。請注意,這是微軟的具體行爲,如果你的目標是Windows以外的任何東西,並且完全不關心可移植性,你可以考慮它。