2013-12-14 25 views
0

所以是的,標題中的問題。但是我問的原因是因爲我正在新波士頓拍攝視頻教程(這很棒),我想知道;爲什麼我們必須自己導入庫?我不是指每個程序員都創建的C++中的每個庫,而是最常用的庫,如cstdlib或cmath?爲什麼啓動時不會自動包含所有C++庫文件?

+3

爲什麼麻煩編譯器解析和編譯你可能不需要的東西? – jrok

+0

「導入庫」是什麼意思?默認情況下,標準C和C++庫*鏈接到程序。 –

+0

**簡化的**答案是,編譯器將不得不讀取所有.c的所有標準.h,否則會很慢。 –

回答

1

這裏涉及兩種不同的事情。構建應用程序時,構建系統鏈接到標準庫,並且鏈接器從該庫中提取需要的任何代碼以及您可能指定的任何其他代碼。

你在說什麼是不是圖書館,但標題。頭文件描述源文件的內容,以便您可以編譯源文件並引用其他地方定義的內容。例如,

#include <stdio.h> 

int main() { 
    puts("Hello, world"); 
    return 0; 
} 

<stdio.h>告訴編譯器,有一個名爲puts功能,可以與作爲其參數字符串字面("Hello, world\n")被調用。這個函數是在標準庫中定義的,所以鏈接到標準庫可以讓你得到這個工作的代碼。

與Java不同的是,C++的設計者決定編譯器不應該通過硬盤驅動器來試圖弄清楚你想在你的代碼中使用什麼東西。你必須告訴它,而標題是這樣做的機制。使用比您需要更多的標題意味着處理比您需要的更多的文本,而這反過來意味着編譯更慢。

+0

啊,所以特定的庫文件有特定的標題,其中一個庫文件是一個名爲的文件頭,它可以爲你提供(函數)。 因此,編譯器就像我猜的目錄。它必須去

,回去,可以說,初始化路徑,然後從該起點抓住另一個頭? 如果我可能會問另一個問題,是一個lib只是頭集合?如果是這樣,你怎麼知道什麼庫使用/如何調用它。 非常感謝 -James。 –

+0

標題是一個文本文件。當編譯器看到'#include whatever'時,它會從該文件中讀取文本,就像它是它正在編譯的文件的一部分一樣。而已。在這一點上,我建議你忽略標題和庫的細節。稍後,您將開始編寫由多個源文件組成的程序,並且您可以瞭解有關標題和鏈接的所有信息。 –

+0

甜,歡呼的人,感謝您的幫助。 開始編程很困難(因爲您確定知道),所以很好,本網站上的人員可以像您一樣提供一些指導。 –

2

包含庫有成本。它們的符號使編譯時間更長,並且使得可執行文件更大。某些庫中的名稱可能與其他庫中的名稱衝突,或與自己的代碼中的名稱衝突。如果它們是自動導入的,那麼你將如何「卸載」它們?誰決定什麼是「常用」?我很少在C++項目中使用stdlib。我有時會用數學,但不經常。

我想不出帶有默認導入任何「軟件包」的語言。 (Java,C#,Python,C/C++)

+0

'java.lang'是自動導入的,不是? Python2中的'exceptions'的內容也是如此,但在Python3中它們只是內建的。 –

0

甚至標準C++庫頭文件不會自動包含的原因是(至少)會顯着增加編譯時間。請參閱,包含頭文件只是將其內容粘貼到#include語句的網站上,所以即使您實際上不需要包含的代碼,也可能會以非常長的翻譯單元結束。

0

問題是,如果包含所有內容,編譯器將花費更長時間來解析和編譯項目。由於stl主要是在模板中編寫的,所以有時特別是當涉及到 mpl(元模板程序)時,這是一種痛苦。

但是,您可以考慮最常見的庫並在每次設置新項目時導入它們。

0

「導入」不是正確的術語。那些庫,沒有頭文件的庫,是「包括」四。 #include文件通知編譯器有關不同功能和其他有用定義的簽名。如果您自動將所有內容都包含在Sun中,那將會增加編譯器的工作量,並延長編譯時間。它也將使編譯器需要更多的內存。另外一個好處是編譯器知道程序員在提供合適的頭文件時的意圖

C/C++旨在保持代碼緊湊,代碼空間更小。他們希望儘可能保持內存的使用,並且這種理念也反映在編譯器中。

相關問題