C运行库
C運(yùn)行庫??
2010-05-14 09:22:04|??分類: 基本程序設(shè)計(jì)知識(shí) |??標(biāo)簽:c運(yùn)行庫?? |舉報(bào) |字號(hào)?訂閱
任何一個(gè)C程序,它的背后都有一套龐大的代碼來進(jìn)行支撐,以使得該程序能夠正常運(yùn)行。這套代碼至少包括入口函數(shù),及其所依賴的函數(shù)所構(gòu)成的函數(shù)集合。當(dāng)然,它還理應(yīng)包括各種標(biāo)準(zhǔn)庫函數(shù)的實(shí)現(xiàn)。這樣的一個(gè)代碼集合稱之為運(yùn)行庫(Runtime Library)。而C語言的運(yùn)行庫,即被稱為C運(yùn)行庫(CRT)。
如果擁有Visual Studio,可以在VC/crt/src里找到一份C語言運(yùn)行庫的源代碼。然而,由于此源代碼過于龐大,僅僅.c文件就有近千個(gè),并且和C++的STL代碼一起毫無組織地堆放在一起,以至于實(shí)際上沒有什么仔細(xì)閱讀的可能性。同樣,Linux下的libc源代碼讀起來也如同啃磚頭。所幸的是,在本章的最后,我們會(huì)一起來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的運(yùn)行庫,讓大家更直觀地了解它。
一個(gè)C語言運(yùn)行庫大致包含了如下功能:
l?????????? 啟動(dòng)與退出:包括入口函數(shù)及入口函數(shù)所依賴的其他函數(shù)等。
l?????????? 標(biāo)準(zhǔn)函數(shù):由C語言標(biāo)準(zhǔn)規(guī)定的C語言標(biāo)準(zhǔn)庫所擁有的函數(shù)實(shí)現(xiàn)。
l?????????? I/O:I/O功能的封裝和實(shí)現(xiàn),參見上一節(jié)中I/O初始化部分。
l?????????? 堆:堆的封裝和實(shí)現(xiàn),參見上一節(jié)中堆初始化部分。
l?????????? 語言實(shí)現(xiàn):語言中一些特殊功能的實(shí)現(xiàn)。
l?????????? 調(diào)試:實(shí)現(xiàn)調(diào)試功能的代碼。
在這些運(yùn)行庫的組成成分中,C語言標(biāo)準(zhǔn)庫占據(jù)了主要地位并且大有來頭。C語言標(biāo)準(zhǔn)庫是C語言標(biāo)準(zhǔn)化的基礎(chǔ)函數(shù)庫,我們平時(shí)使用的printf、exit等都是標(biāo)準(zhǔn)庫中的一部分。標(biāo)準(zhǔn)庫定義了C語言中普遍存在的函數(shù)集合,我們可以放心地使用標(biāo)準(zhǔn)庫中規(guī)定的函數(shù)而不用擔(dān)心在將代碼移植到別的平臺(tái)時(shí)對(duì)應(yīng)的平臺(tái)上不提供這個(gè)函數(shù)。
?
運(yùn)行庫是平臺(tái)相關(guān)的,因?yàn)樗c操作系統(tǒng)結(jié)合得非常緊密。C語言的運(yùn)行庫從某種程度上來講是C語言的程序和不同操作系統(tǒng)平臺(tái)之間的抽象層,它將不同的操作系統(tǒng)API抽象成相同的庫函數(shù)。比如我們可以在不同的操作系統(tǒng)平臺(tái)下使用fread來讀取文件,而事實(shí)上fread在不同的操作系統(tǒng)平臺(tái)下的實(shí)現(xiàn)是不同的,但作為運(yùn)行庫的使用者我們不需要關(guān)心這一點(diǎn)。雖然各個(gè)平臺(tái)下的C語言運(yùn)行庫提供了很多功能,但很多時(shí)候它們畢竟有限,比如用戶的權(quán)限控制、操作系統(tǒng)線程創(chuàng)建等都不是屬于標(biāo)準(zhǔn)的C語言運(yùn)行庫。于是我們不得不通過其他的辦法,諸如繞過C語言運(yùn)行庫直接調(diào)用操作系統(tǒng)API或使用其他的庫。Linux和Windows平臺(tái)下的兩個(gè)主要C語言運(yùn)行庫分別為glibc(GNU C Library)和MSVCRT(Microsoft Visual C Run-time。
值得注意的是,像線程操作這樣的功能并不是標(biāo)準(zhǔn)的C語言運(yùn)行庫的一部分,但是glibc和MSVCRT都包含了線程操作的庫函數(shù)。比如glibc有一個(gè)可選的pthread庫中的pthread_create()函數(shù)可以用來創(chuàng)建線程;而MSVCRT中可以使用_beginthread()函數(shù)來創(chuàng)建線程。所以glibc和MSVCRT事實(shí)上是標(biāo)準(zhǔn)C語言運(yùn)行庫的超集,它們各自對(duì)C標(biāo)準(zhǔn)庫進(jìn)行了一些擴(kuò)展。
總結(jié)
- 上一篇: 监督学习 | 非线性回归 之多项式回归原
- 下一篇: 如何使用C来扩展python功能。