為什麼不包含<algorithm>也可以用std::sort?
01-15
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,這是什麼理論?