2011-12-01 62 views
1

有人能說我在哪裏可以找到源文件標準庫的定義在哪裏?
例如,文件string.c在哪裏包含string.h中原型函數的定義?最重要的是,它存在嗎?庫定義位於何處?

+1

這取決於你的編譯器。 – Abyx

+2

http://ftp.gnu.org/gnu/libc/ – nmichaels

+2

glibc源代碼位於http://sourceware.org/git/?p=glibc.git – pmg

回答

3

其全部處於壓縮狀態,其中一些可能由asm優化。您需要查找編譯器的源以查看定義

+1

它不是全部處於編譯狀態。考慮'字符串' –

+1

@John Dibling,同意!我的意思是C函數 – triclosan

3

對於開源的GCC,您可以從其鏡像站點here下載libstdC++庫的源代碼。包含在下載中的是std庫的來源。請記住,不同的供應商會有不同的實現,所以提供的鏈接僅僅是GCC的開發人員如何決定實現標準庫。

2

您可能不會喜歡這個。

C++標準沒有具體說明標準庫中的任何東西實際上是在哪裏實現的。它說那裏的東西都宣佈,而只是它的名字的文件(S),您必須把名字在#include例如,標準說這種程度:

std::string

typedefbasic_string<...>,並且爲了將typedef加入到您的程序中,您必須#include <string>。它實際上並沒有說basic_stringstring是在<string>中定義的,但它並沒有說在你的硬盤上<string>的位置。事實上,它在現實世界中通常不在<string>中。在我的實現,(MSVC10)string在不同的文件中,定義,它看起來像這樣:

typedef basic_string<char, char_traits<char>, allocator<char> > 
    string; 

有用的,是吧?

還有另一個方面。標準庫中的很多東西都是模板材料,比如string,所以由於模板在C++中的工作方式,這些工具必須是所謂的「包含庫」。但並非標準庫中的所有內容都由模板組成。

考慮sprintf。該標準說這個聲明是由#include <cstdio>提供的,但是,就像string甚至沒有聲明。而sprintf不是模板的東西。該實現在通常稱爲CRT的C運行時庫中實現。這是一個DLLs和LIBs(MSVC10,無論如何)的集合,您的程序鏈接到運行代碼如sprintf

現在壞消息是那些在CRT中的組件通常沒有源代碼。你不知道sprintf在哪裏實現,你不能看源代碼。在這些情況下,您只剩下一個替代方案,除了使用MicroSoft工作以外,您可以查看源代碼。 :)

+1

在5年前(甚至10年)的互聯網上,有一個CRT的源代碼(實際上是整個Windows)。但我個人會看GNU,uclibc等......有些東西告訴我,看MS的sprintf實現無論如何是沒用的。 – 2011-12-01 15:49:42