[英]Where are Library definitions located?
有人可以說我在哪里可以找到源文件,標准庫的定義在哪里?
例如,包含string.h
原型函數的定義的文件string.c
在哪里? 最重要的是,它存在嗎?
它全部處於編譯狀態,有些可能已通過asm優化。 您需要找到編譯器的源才能查看定義
對於GCC,這是開源的,你可以從他們的鏡像站點下載的的libstdc ++庫源在這里 。 下載中包括了std庫的源代碼。 請記住,不同的供應商將有不同的實現,因此提供的鏈接僅僅是GCC的開發人員決定實現標准庫的方式
您可能不會喜歡這樣。
C ++標准並未具體說明標准庫中實際執行的位置。 它說明了聲明的位置 ,但僅以它為文件命名的程度,您必須#include
才能引入名稱。例如,標准說:
std::string
是basic_string<...>
的typedef
,並且為了將該typedef
引入程序,您必須#include <string>
。 它實際上並沒有說basic_string
或string
是在<string>
中定義的,並且也沒有說<string>
在硬盤上的位置。 實際上,在現實世界中通常不在<string>
中。 在我的實現中,(MSVC10) string
是在另一個文件<xstring>
,它看起來像這樣:
typedef basic_string<char, char_traits<char>, allocator<char> >
string;
有用吧?
還有另一方面。 標准庫中的許多內容都是模板內容,例如string
,因此,由於模板在C ++中的工作方式,這些功能必須稱為“包含庫”。 但並不是標准庫中的所有內容都由模板組成。
考慮sprintf
。 標准說,該聲明是由#include <cstdio>
提供的,但是,即使string
在聲明的地方也一樣。 sprintf
不是模板。 該實現在通常稱為CRT的C運行庫中。 這是DLL和LIB的集合(無論如何在MSVC10中),您的程序鏈接到這些DLL和LIB來運行sprintf
代碼。
現在的壞消息是,CRT中的那些組件通常出廠時都沒有源代碼。 您不知道sprintf
的實現位置,也看不到源代碼。 在這些情況下,除了找到MicroSoft的工作之外,您別無選擇,因此您可以看一下源代碼。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.