外部依賴性在這裏(其實很容易被忽略)!可是由它能夠看到許多隱藏的東西!linux
它能說明什麼問題?ios
看右邊程序源代碼中直接使用system("pause");函數
而學過C語言的小夥伴們應該都曉得,要使用這個函數,必需要引入stdlib.h,即:測試
#include<stdlib.h>字符串
可是這裏爲何不引入,就可使用了呢?string
其實並無違背「函數調用時候必需要有函數體的支撐」這個客觀規律。只是它被隱藏了。就在這裏:io
不感受奇怪嗎?已經被引入進來了!可是本身並無包含它啊,這就是「文件依賴」而致使的結果。編譯
其實寫不一樣的程序會用到不一樣的函數,也就須要包含不一樣的文件。但此時,若是該文件中的代碼又須要其餘文件先被加載,就產生了依賴(這在linux中編譯軟件的時候常常看到,那是軟件依賴,所以纔有yum安裝軟件方式的出現)stream
咱們先看看不一樣程序的依賴文件列表:軟件
1:
這裏不引入任何文件,因此那個「外部依賴項」目錄是空的。
如今改成:
編譯以後,能夠看到依賴目錄裏有stdio.h,同時還牽扯出要讓stdio.h裏面的代碼正常運行的其餘依賴文件。因此有一大堆。
繼續改成:
可見,你手工包含的stdio.h,stdlib.h都被引入了,同時還引入了其餘依賴文件。
再改成:
打開以後看:
可見,文件名它能夠取.h後綴的,也能夠取沒有任何後綴的,都是個文件,它本身打的開就行,同時也是和C語言裏面的頭文件區別開來,能一眼就知道是C++特有特性的文件。
可見,雖然你只引入iostream文件,可是它須要其餘的依賴文件,這樣就把stdio.h,stdlib.h給引入進來了。
因此你能夠直接使用system("pause");
試着打開iostream這個文件:
可見,這個文件裏面確實包含了istream,才引進來。
同時能夠看到string.h也被包含進來了,就是C語言裏面的那種處理字符串的用法。因此後續C++裏不想用這個string.h裏面的東西了,就須要另外引入string文件,才能使用string類型(由於該string文件沒有被包含進來,因此纔要本身包含)。
注意:
因爲文件之間的包含和依賴不少很細,還隨機穿插,因此列出了個列表出來方便查看,它其實沒有這個義務的,因此讓你在編譯以後才列出了給你看都已是好的了,因此要求不要過高。因此:記住在編譯以後再看。若是沒列出了,從新關閉軟件,從新打開編譯程序,就能夠看到了。爲何會這樣?由於它只有編譯的時候才知道要依賴什麼,而當時已經把相關的代碼拿走放到編譯結果的可執行文件去了,這個軟件的這個地方只是給你個回饋信息,因此滯後甚至不給你列出了給你看,也是能夠的。因此若是沒列出了,那就從新關閉軟件,從新編譯運行一下就看到了(反正我測試的時候是這種效果)。