為什麼不包含<algorithm>也可以用std::sort?

sort - C++ Reference

比如這裡邊的sample code,即使刪去&,程序編譯運行依然正常,不科學呀。 為什麼沒有linker error呢?


首先聲明一點,編譯跟鏈接是兩個過程。就算是缺少頭文件,編譯時就應該發生錯誤,而不會「linker error」。

題主的問題。我在Xcode上試驗過,Xcode默認的編譯系統是LLVM。查看vector頭文件,可以看到文件中有下面語句:

.....
#include &
#include &
#include &
#include &
.....

至少在我所用的LLVM版本的標準庫上,

#include &

的時候,已經間接包含了algorithm頭文件。因此刪除

#include &

例子也可以順利編譯通過。但這樣並不表達所有的編譯系統都間接包含了algorithm。為保險,例子中還是需要直接包含algorithm。

編寫跨平台的代碼,比如同時運行在iOS和Android上的遊戲。經常遇到在iOS上面編譯成功,Android上出現「函數沒有定義」的編譯錯誤。反過來一樣,同樣會出現Android編譯成功,而iOS編譯錯誤的情況。這很大部分的原因是其中一個平台編譯時,間接包含了所需的頭文件,而另一平台沒有包含。這時加上需要的頭文件就行了。


謝謝大家回答。

是這樣的,vector包含了algorithm,所以編譯的時候不會出錯。

g++默認鏈接libstdc++, 所以鏈接不會出錯。

g++ http://example.cc --std=c++11

ldd a.out

libstdc++.so.6 =&> /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f022e1e6000)

libgcc_s.so.1 =&> /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f022dfd0000)

libc.so.6 =&> /lib/x86_64-linux-gnu/libc.so.6 (0x00007f022dc09000)

...


推薦閱讀:

計算機科學與技術專業的學生有必要考取國家計算機等級證書嗎?
為何 OS X 改名為 macOS,而不叫 Mac OS?
聖彼得堡悖論,期望與實際相差為何這麼大?
Windows電腦應當採取什麼散熱策略和安全策略?
計算機模擬的無法解決一個BUG,這是什麼理論?

TAG:演算法 | 計算機 | 計算機科學 | STL | C |