C运行库
C運行庫??
2010-05-14 09:22:04|??分類: 基本程序設計知識 |??標簽: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標準庫進行了一些擴展。
總結
- 上一篇: 监督学习 | 非线性回归 之多项式回归原
- 下一篇: 如何使用C来扩展python功能。