簡體   English   中英

庫定義在哪里?

[英]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_stringstring是在<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM