2011-06-02 85 views
4

我是編程新手。學習C到現在爲止。我明白,頭文件只包含聲明和函數原型,而不是函數本身。我對麼?頭文件和標準庫

我知道庫是包含不同目標代碼的單個文件。這些目標代碼是否必須只用C語言編寫,或者其他語言是否也可以用來生成這些目標代碼?

在鏈接上,整個庫文件是附加到可執行文件還是附加到頭文件中聲明的對象代碼?

回答

9

據我所知,頭文件只 包含聲明和函數原型 ,而不是功能 自己。

通常,是的(雖然理論上你可以把任何你想要的代碼放在頭文件中)。請記住,頭文件通常只是#include -d到源文件中,而#include基本上等同於複製和粘貼。

據我所知,圖書館是一個單一的文件

不一定。 「圖書館」是一個鬆散的術語,但一般來說,它用於描述一起執行一些有用的任務集合的函數(和潛在的數據)。這些功能可以在一個或多個源文件中定義。通常,庫被預編譯爲獨立的對象文件。但是,不一定。

只在C語言

號,他們可以在任何語言編寫的(因爲它總是會被編譯成原始機器代碼)一定用這些目標代碼。但是如果你想要使用使用來自C的庫,那麼必須滿足某些兼容性要求,以確保C編譯器知道如何正確調用庫函數。

連接上,確實整個庫文件得到重視可執行

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

2

頭文件通常只包含聲明和原型,但在現代C中它可以包含「靜態內聯」函數及其定義。 (在C++中,模板類在頭文件中的實現是很常見的,但現在不用擔心...)

庫中的對象可以用任何語言編寫;只要它們遵守「C連接」(本質上,在彙編級調用和命名約定),它們就可以調用並從C函數中調用。例如,用匯編語言編寫一些性能關鍵的庫函數並不罕見。

最後一個問題的答案取決於鏈接器。我相信GNU ld包含了所有.o文件中的所有函數都被引用的功能,但說實話,我甚至不確定。無論如何,你鏈接的大多數圖書館都是「共享圖書館」,這意味着你的問題的答案甚至不重要。 (實際上,通常它並不重要,因爲操作系統在實際訪問時只會從磁盤加載頁面,所以磁盤上可執行文件的大小以及運行時所需的RAM數量可能會非常不同。 )

+0

很好的回覆..輸入輸出函數如printf和scanf怎麼樣?他們是用匯編語言編寫的,因爲他們可能會調用一些中斷? – KawaiKx 2011-06-02 01:08:32

+1

不,但你有正確的想法。 printf/scanf用C寫成;他們最終調用系統調用read()和write()。這些系統調用通常使用匯編來捕獲內核。只有內核才能與硬件通話;您的程序只能通過系統調用內核來間接訪問硬件。即使內核大部分都是用C語言編寫的,但是在最低級別上它的函數是用匯編語言編寫的。 – Nemo 2011-06-02 01:13:17

+0

非常感謝Nemo。你搖滾:-) – KawaiKx 2011-06-02 01:59:07

3

我明白,頭文件只包含聲明和函數原型,而不是函數本身。我對麼?

是的,在大多數情況下。代碼可以出現在編譯器試圖「內聯」的頭文件中(查看)。

僅在C語言或其他 語言編寫的必然 這些目標代碼還可以用於生成 這樣的對象代碼?

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

是否將整個庫文件附加到可執行文件或只是在頭文件中聲明的對象代碼?

鏈接只是告訴可執行文件如何調用底層的庫代碼,它不會「附加」庫,除非你正在做「靜態」鏈接。