2017-01-19 27 views
1

我想從我的C++標準庫中找到它們的重名的函數。我在MacOS,所以使用nm命令,我可以檢查一個dylib我編譯的標準庫中的std :: endl在哪裏?

nm -g /usr/local/lib/libc++.dylib 
nm -g /usr/local/lib/libc++abi.dylib 

在輸出中,我能找到錯位的名稱爲std::cout

0000000000079ec0 S __ZNSt3__14coutE 
0000000000079f60 S __ZNSt3__15wcoutE 
etc... 

但是,我沒有找到任何條目爲std::endl

有趣的是,我的LLVM IR解釋也無法找到std::endl,雖然std::cout正常工作:

LLVM ERROR: Program used external function  
'__ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_' which could not be resolved! 

我應該在哪裏希望找到我的系統上std::endl

+0

你可以嘗試找到'的std :: flush'? – Rakete1111

+2

我懷疑'std :: endl'不能鏈接,因爲它只是'<<'\ n'<< std :: flush' – YSC

+0

'std :: flush'似乎存在:'0000000000011bb0 T __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv' – sdgfsdh

回答

2

正如YSC提到的,std::endl是一個函數(可能內聯),它所做的只是輸出結束行\n字符,然後調用flush

http://en.cppreference.com/w/cpp/io/manip/endl

貌似libcxx已經隱藏 ENDL:https://github.com/llvm-mirror/libcxx/blob/master/include/ostream#L999

雖然沖洗不具有這樣的屬性:https://github.com/llvm-mirror/libcxx/blob/master/include/ostream#L938

+1

呃......它很清楚(http://en.cppreference.com/w/cpp/io/manip/endl)模板,所以這就是爲什麼它沒有被編譯成C++標準的原因圖書館。無論是否內聯都是另一回事。 – IInspectable

+0

[std :: flush](http://en.cppreference.com/w/cpp/io/manip/flush)也是一個模板 – crezefire

+0

那麼, OP從未指出,std :: flush會從C++標準庫中導出。我不明白你想要創造的點。 – IInspectable

相關問題