簡體   English   中英

對編譯器如何在C ++程序中包括標准庫感到困惑

[英]Confused about how the compiler includes standard libraries in c++ program

我是C ++編程的新手,對編譯器如何在c ++程序中包含標准庫感到有些困惑。 比如說我要使用sqrt()函數。 我知道我必須在源代碼中包含math.h頭文件,但是數學庫包含除sqrt()之外的許多函數。 因此,我的問題是所有這些函數源代碼都已添加到程序中,不是必需的,還是僅僅是我需要的功能?

我希望我的問題很清楚,並預先感謝。

不是模板的函數(不是那么簡單,它們只是一兩行)將分別編譯,然后存儲在“ libary”(不是頭文件,它僅包含double sqrt(double);或某些)中這樣)。

編譯器將(鏈接到正確的編譯時標志)鏈接到包含那些函數的C庫。 然后,鏈接器(由編譯器調用)將介紹在構建庫時編譯的代碼。 因此,通常,在構建程序時不會編譯源代碼-它是在其他時間完成的。

鏈接器了解您正在構建的代碼需要哪些功能,因此僅將這些功能添加到程序中,而不是所有功能[但是,它可能會提取除您要求的功能之外的其他功能,例如,可能是一些輔助功能,也可能是sqrt需要的一些通用錯誤處理功能。

不,鏈接意味着鏈接器會從您的庫中找出構建程序所需的符號(函數和數據對象),然后僅包含那些符號。

實際上,對於動態鏈接,它甚至不包括函數本身,而僅包括對該函數的引用以及如何加載包含該函數的庫。

通常,與可執行文件鏈接的庫不是源代碼 ,而是二進制對象,它們已經被翻譯成機器語言(“已編譯”)。

您在庫和頭文件之間感到困惑。 庫是實現。 頭文件包含聲明。

您將#include用於庫文件,以便編譯器可以找到所使用函數的語法和語義。

所有聲明(除非被預處理器指令阻止)都由編譯器解析並存儲在字典中。 關於不使用聲明的唯一問題是,它占用了編譯器字典中的空間。 通常這不是問題(現代編譯器具有大容量詞典)。

至於在程序中添加功能,這是在鏈接階段(通常由鏈接器應用程序)處理的。 這取決於編譯器。 從根本上講,只有程序使用的函數才從庫中拉出(僅靜態庫),並放入可執行文件中。 某些編譯器可能會加快構建過程,並包含一些常用的功能組,但您可能不使用。 這樣可以加快構建處理器的速度,但會使可執行文件更大。

一些庫函數可能會使用其他庫函數。 這意味着庫函數可能會在可執行文件中添加更多代碼。 一個示例是printf 由於所有格式說明符, printf函數比puts需要更多的支持。 因此, printf可能包括其他(內部)庫函數。

暫無
暫無

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

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