所以是的,標題中的問題。但是我問的原因是因爲我正在新波士頓拍攝視頻教程(這很棒),我想知道;爲什麼我們必須自己導入庫?我不是指每個程序員都創建的C++中的每個庫,而是最常用的庫,如cstdlib或cmath?爲什麼啓動時不會自動包含所有C++庫文件?
回答
這裏涉及兩種不同的事情。構建應用程序時,構建系統鏈接到標準庫,並且鏈接器從該庫中提取需要的任何代碼以及您可能指定的任何其他代碼。
你在說什麼是不是圖書館,但標題。頭文件描述源文件的內容,以便您可以編譯源文件並引用其他地方定義的內容。例如,
#include <stdio.h>
int main() {
puts("Hello, world");
return 0;
}
頭<stdio.h>
告訴編譯器,有一個名爲puts
功能,可以與作爲其參數字符串字面("Hello, world\n"
)被調用。這個函數是在標準庫中定義的,所以鏈接到標準庫可以讓你得到這個工作的代碼。
與Java不同的是,C++的設計者決定編譯器不應該通過硬盤驅動器來試圖弄清楚你想在你的代碼中使用什麼東西。你必須告訴它,而標題是這樣做的機制。使用比您需要更多的標題意味着處理比您需要的更多的文本,而這反過來意味着編譯更慢。
啊,所以特定的庫文件有特定的標題,其中一個庫文件是一個名爲
的文件頭,它可以爲你提供(函數)。 因此,編譯器就像我猜的目錄。它必須去標題是一個文本文件。當編譯器看到'#include whatever'時,它會從該文件中讀取文本,就像它是它正在編譯的文件的一部分一樣。而已。在這一點上,我建議你忽略標題和庫的細節。稍後,您將開始編寫由多個源文件組成的程序,並且您可以瞭解有關標題和鏈接的所有信息。 –
甜,歡呼的人,感謝您的幫助。 開始編程很困難(因爲您確定知道),所以很好,本網站上的人員可以像您一樣提供一些指導。 –
包含庫有成本。它們的符號使編譯時間更長,並且使得可執行文件更大。某些庫中的名稱可能與其他庫中的名稱衝突,或與自己的代碼中的名稱衝突。如果它們是自動導入的,那麼你將如何「卸載」它們?誰決定什麼是「常用」?我很少在C++項目中使用stdlib。我有時會用數學,但不經常。
我想不出帶有默認導入任何「軟件包」的語言。 (Java,C#,Python,C/C++)
'java.lang'是自動導入的,不是? Python2中的'exceptions'的內容也是如此,但在Python3中它們只是內建的。 –
甚至標準C++庫頭文件不會自動包含的原因是(至少)會顯着增加編譯時間。請參閱,包含頭文件只是將其內容粘貼到#include
語句的網站上,所以即使您實際上不需要包含的代碼,也可能會以非常長的翻譯單元結束。
問題是,如果包含所有內容,編譯器將花費更長時間來解析和編譯項目。由於stl主要是在模板中編寫的,所以有時特別是當涉及到 mpl(元模板程序)時,這是一種痛苦。
但是,您可以考慮最常見的庫並在每次設置新項目時導入它們。
「導入」不是正確的術語。那些庫,沒有頭文件的庫,是「包括」四。 #include
文件通知編譯器有關不同功能和其他有用定義的簽名。如果您自動將所有內容都包含在Sun中,那將會增加編譯器的工作量,並延長編譯時間。它也將使編譯器需要更多的內存。另外一個好處是編譯器知道程序員在提供合適的頭文件時的意圖。
C/C++旨在保持代碼緊湊,代碼空間更小。他們希望儘可能保持內存的使用,並且這種理念也反映在編譯器中。
- 1. 爲什麼不啓動自舉卡包含圖像?
- 2. 爲什麼計時器自動啓動?
- 3. 爲什麼我的.NET Windows服務有時不會自動啓動?
- 4. 什麼時候包含一個索引(自動啓發式)
- 5. 爲什麼不是所有線程都同時啓動?
- 6. 爲什麼Tomcat包含JAVA_OPTS Xmx時無法啓動?
- 7. 任務有時會啓動,有時候不會,爲什麼?如何修改它?
- 8. WiX自動文件包含
- 9. 爲什麼Openbox自動啓動不啓動某些程序?
- 10. 爲什麼我的awakeFromNib不會啓動?
- 11. 爲什麼這個podspec自動包含sqlite庫?
- 12. 爲什麼我的活動會自動重新啓動?
- 13. 如何自動啓動庫中包含的活動?
- 14. 爲什麼編輯文件時文件不會自動從VSS中檢出?
- 15. 爲什麼jQuery不能自動使所有的功能「實時」?
- 16. VisualStudio爲什麼每次啓動時都會部署庫?
- 17. 在C#中啓動程序包括所有文件
- 18. 如何驗證啓動時是否存在所有必需的包含文件
- 19. 當作爲依賴項包含在Composer中時自動包含文件包
- 20. 當我放入啓動文件夾時,EXE的行爲會有所不同
- 21. 不會啓動,但其他所有操作都會啓動?
- 22. 爲什麼TestInitialize不會自動調用?
- 23. 計時器爲什麼不啓動?
- 24. EditText不會自動啓動
- 25. dired +不會自動啓動
- 26. 自動包含類庫
- 27. 爲什麼roxygen2不會自動更新DESCRIPTION文件中的「Imports」?
- 28. 爲什麼CountDownTimer不會在應該啓動的時候啓動onTick?
- 29. Mysql5.7.18爲什麼不啓動?
- 30. GlassFish爲什麼不啓動?
爲什麼麻煩編譯器解析和編譯你可能不需要的東西? – jrok
「導入庫」是什麼意思?默認情況下,標準C和C++庫*鏈接到程序。 –
**簡化的**答案是,編譯器將不得不讀取所有.c的所有標準.h,否則會很慢。 –