首頁 >後端開發 >C++ >C 和 C 中的「內聯」、「靜態內聯」和「外部內聯」有何不同?

C 和 C 中的「內聯」、「靜態內聯」和「外部內聯」有何不同?

Barbara Streisand
Barbara Streisand原創
2024-12-24 17:51:11268瀏覽

What's the Difference Between `inline`, `static inline`, and `extern inline` in C and C  ?

理解 extern inline

在 C在程式語言中,內聯函數為編譯器提供了一個提示,可以透過直接插入函數體來潛在地最佳化程式碼在呼叫時而不是產生單獨的子程式

內聯變體之間的差異

在K&R C 和C89 中,內聯沒有標準語義,但許多編譯器以不同的解釋支持它。 GCC 引入了三種變體:內聯、靜態內聯和外部內聯。

  • inline: 建議內嵌最佳化,但也會產生外聯版本。跨編譯單元只能存在一個定義。
  • extern inline: 與內聯類似,但不會產生外聯版本。但是,可能會呼叫外聯版本,該版本必須存在於另一個編譯單元中。
  • static inline: 產生檔案靜態,但外部不可見,內聯版本。不會產生外聯版本。

C99 和 GNU99

在 C99 中,對 extern inline 的語義進行了修改以反映 GNU89 的內聯行為。內聯和靜態內聯保持不變。

C

在 C 中,內聯函數在使用的任何地方都必須具有相同的定義。同一符號的多個定義由編譯器/連結器處理。 C 中沒有定義 static inline 和 extern inline,儘管某些編譯器可能支援它們。

使用extern inline 確保內聯

在您需要內聯的特定場景中對於使用FILELINE巨集的函數, extern inline 會不保證函數會被內嵌。然而,它是最接近實現此所需行為的 C99 等效項。如果函數未內聯,編譯器或連結器可能會發出錯誤。

編譯器和供應商差異

不同編譯器供應商和版本之間的行為可能會有所不同,因此始終建議您查閱適合您環境的特定文檔。

以上是C 和 C 中的「內聯」、「靜態內聯」和「外部內聯」有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn