簡體   English   中英

header 文件和標准庫

[英]header file and standard library

我是編程新手。 從現在開始學習 C。 我知道 header 文件只包含聲明和 function 原型,而不是函數本身。 我對么?

我了解庫是包含不同 object 代碼的單個文件。 這些 object 代碼是否必須僅以 C 語言或其他語言編寫,也可以用於生成此類 object 代碼?

在鏈接時,整個庫文件是否附加到可執行文件或只是 header 文件中聲明的 object 代碼?

我知道 header 文件只包含聲明和 function 原型,而不是函數本身。

通常,是的(盡管理論上您可以將所需的任何代碼放入 header 文件中)。 請記住,header 文件通常只是#include -d 到源文件中,而#include基本上相當於復制和粘貼。

我知道圖書館是一個單一的文件

不必要。 “庫”是一個有點松散的術語,但一般來說,它用於描述一組功能(和潛在的數據),它們一起執行一些有用的任務集。 這些函數可以定義在一個或多個源文件中。 通常,庫被預編譯成獨立的 object 文件。 但同樣,不一定。

這些 object 代碼是否必須僅用 C 語言編寫

不,它們可以用任何語言編寫(因為它總是被編譯成原始機器代碼)。 但是如果要使用C 中的庫,則必須滿足一定的兼容性要求,以確保 C 編譯器知道如何正確調用庫函數。

鏈接時,整個庫文件是否附加到可執行文件

有時。 這就是所謂的static 鏈接 另一種主要類型是動態鏈接,其中庫 object 代碼在運行時鏈接。

我知道 header 文件只包含聲明和 function 原型,而不是函數本身。 我對么?

是的,在大多數情況下。 代碼可以出現在編譯器將嘗試“內聯”(查找)的標題中。

這些 object 代碼是否必須僅以 C 語言或其他語言編寫,也可以用於生成此類 object 代碼?

它們可以用任何編譯的語言編寫,但最常見的是 C 和 C++。

整個庫文件是否附加到可執行文件或只是 header 文件中聲明的 object 代碼?

鏈接只是告訴可執行文件如何調用底層庫代碼,除非您進行“靜態”鏈接,否則它不會“附加”庫。

header 文件通常只包含聲明和原型,但在現代 C 中,它可以包含“靜態內聯”函數及其定義。 (在 C++ 中,模板類的實現通常在 header 文件中,但暫時不要擔心……)

庫中的對象可以用任何語言編寫; 只要它們遵守“C 鏈接”(本質上是匯編級別的調用和命名約定),它們就可以從 C 函數調用和調用。 例如,用匯編語言編寫一些對性能至關重要的庫函數並不少見。

您最后一個問題的答案取決於 linker。 我相信 GNU ld 包括 all.o 文件中的所有函數,其中任何函數都被引用,但老實說,我什至不確定。 無論如何,您鏈接的大多數庫都是“共享庫”,這意味着您的問題的答案甚至無關緊要。 (實際上,一般來說這並不重要,因為操作系統只會在實際訪問頁面時從磁盤加載頁面。因此磁盤上可執行文件的大小和運行時所需的 RAM 量可能會非常非常不同。 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM