天天看點

C運作庫簡介

C運作庫簡介

任何一個C程式,它的背後都有一套龐大的代碼來進行支撐,以使得該程式能夠正常運作。這套代碼至少包括入口函數,及其所依賴的函數所構成的函數集合。當然,它還理應包括各種标準庫函數的實作。這樣的一個代碼集合稱之為運作庫(Runtime Library)。而C語言的運作庫,即被稱為C運作庫(CRT)。

如果擁有Visual Studio,可以在VC/crt/src裡找到一份C語言運作庫的源代碼。然而,由于此源代碼過于龐大,僅僅.c檔案就有近千個,并且和C++的STL代碼一起毫無組織地堆放在一起,以至于實際上沒有什麼仔細閱讀的可能性。同樣,Linux下的libc源代碼讀起來也如同啃磚頭。所幸的是,在本章的最後,我們會一起來實作一個簡單的運作庫,讓大家更直覺地了解它。

一個C語言運作庫大緻包含了如下功能:

l           啟動與退出:包括入口函數及入口函數所依賴的其他函數等。

l           标準函數:由C語言标準規定的C語言标準庫所擁有的函數實作。

l           I/O:I/O功能的封裝和實作,參見上一節中I/O初始化部分。

l           堆:堆的封裝和實作,參見上一節中堆初始化部分。

l           語言實作:語言中一些特殊功能的實作。

l           調試:實作調試功能的代碼。

在這些運作庫的組成成分中,C語言标準庫占據了主要地位并且大有來頭。C語言标準庫是C語言标準化的基礎函數庫,我們平時使用的printf、exit等都是标準庫中的一部分。标準庫定義了C語言中普遍存在的函數集合,我們可以放心地使用标準庫中規定的函數而不用擔心在将代碼移植到别的平台時對應的平台上不提供這個函數。

運作庫是平台相關的,因為它與作業系統結合得非常緊密。C語言的運作庫從某種程度上來講是C語言的程式和不同作業系統平台之間的抽象層,它将不同的作業系統API抽象成相同的庫函數。比如我們可以在不同的作業系統平台下使用fread來讀取檔案,而事實上fread在不同的作業系統平台下的實作是不同的,但作為運作庫的使用者我們不需要關心這一點。雖然各個平台下的C語言運作庫提供了很多功能,但很多時候它們畢竟有限,比如使用者的權限控制、作業系統線程建立等都不是屬于标準的C語言運作庫。于是我們不得不通過其他的辦法,諸如繞過C語言運作庫直接調用作業系統API或使用其他的庫。Linux和Windows平台下的兩個主要C語言運作庫分别為glibc(GNU C Library)和MSVCRT(Microsoft Visual C Run-time。

值得注意的是,像線程操作這樣的功能并不是标準的C語言運作庫的一部分,但是glibc和MSVCRT都包含了線程操作的庫函數。比如glibc有一個可選的pthread庫中的pthread_create()函數可以用來建立線程;而MSVCRT中可以使用_beginthread()函數來建立線程。是以glibc和MSVCRT事實上是标準C語言運作庫的超集,它們各自對C标準庫進行了一些擴充。