c運行庫、c標準庫、windows API都是什麼玩意


C運行庫和C標準庫的關係

C標準庫,顧名思義既然是標準,就是由標準組織制定的。是由“美國國家標準協會(American National Standards Institute,ANSI)”爲了規範C語言庫而制定的標準。在最初,各個大學各個公司使用的C語言庫都不盡相同,造成相互移植非常困難,在這個背景下,制定了這個標準。

C運行庫,是和平臺相關的,即和操作系統相關的。它由不同操作系統不同開發平臺提供不同的C運行庫。但是C運行庫的部分實現是基於C標準庫的,即C運行庫是各個操作系統各個開發工具根據自身平臺開發的庫,某種程度上,可以說C運行庫是C標準庫的一個擴展庫,只是加了很多C標準庫所沒有的與平臺相關的或者不相關的庫接口函數。舉例子如:c標準庫的strcpy函數負責字符串的拷貝,但是由於缺少對目地字符串緩衝區大小的控制,極有可能導致緩衝區溢出(大量的緩衝區溢出攻擊都是由於這種漏洞而產生的);相反,Windows提供了能夠實現同樣功能的安全的字符串拷貝函數,減少了緩衝區攻擊的可能,strcpy_s。這些函數是以c運行庫的方式提供的,當然,不同的操作系統,c運行時庫可能不同,但是對c標準庫的支持是完全一致的,也就是說,在不同的操作系統上,使用同一個c標準庫的函數必然產生一致的結果。

C標準庫中提供的有:

l           標準輸入輸出(stdio.h)。

l           文件操作(stdio.h)。

l           字符操作(ctype.h)。

l           字符串操作(string.h)。

l           數學函數(math.h)。

l           資源管理(stdlib.h)。

l           格式轉換(stdlib.h)。

l           時間/日期(time.h)。

l           斷言(assert.h)。

l           各種類型上的常數(limits.h & float.h)。

你寫的程序可以沒有math庫,程序照樣運行,只是不能處理複雜的數學運算,不過如果沒有了C   run-time庫,main()就不會被調用,exit()也不能被響應。因爲C   run-time   library包含了C程序運行的最基本和最常用的函數。  

如下是C運行庫與C標準庫的關係:

一個C運行庫大致包含了如下功能:

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

l           標準函數:由C語言標準規定的C語言標準庫所擁有的函數實現。(C標準庫

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

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

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

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

操作系統API和C運行庫CRT,C標準庫之間

首先,C語言要早於Windows出現,而且C語言實際標準制定的開始時間也要早於Windows(API概念出現的)系統的開發時間。所以Windows系統在開發的時候是完全可以使用C語言的。目前最多的說法是用C和彙編實現的。那麼只要用C,就可能用C標準庫。

我們假設兩種情況,一是Windows API的實現包含部分C標準庫函數的功能實現,這就決定了這部分操作系統API的實現是由調用標準庫實現的,那麼在發佈時需要加入所用到的c標準庫DLL一同發佈。

 二是微軟的內核(包括API)開發是使用着一個和平臺嚴格相關的C語言的靜態的鏈接庫,這樣不必提供Dll也能開發和發行。而且必然的這個C庫是在彙編的基礎上實現的,也就是說這個庫裏面的C函數都是(至少有很大比例)披着C語法的彙編代碼。

要你是微軟,你選擇哪個呢?也許是兩者兼而有之,也許是後者。

一般情況下,我們說C運行庫暗含的意思是哪種平臺哪個開發平臺的C運行庫,

CRT的實現是基於Windows API的,而WindowsAPI的開發也是基於C語言的,但不是或者不一定基於CRT(或者C標準庫)的。

再深一步,雖然CRT是基於操作系統 API實現的,但並不代表所有的CRT封裝了操作系統 API,如一些用戶的權限控制,操作系統線程創建等都不屬於C運行庫,於是對於這些操作我們就不得不直接調用操作系統API或者其他庫。

總結一下,C標準庫就是任何平臺都可以使用的基本C語言庫。而CRT除了將C標準庫加入所屬範圍外,還擴展了與平臺相關的接口庫,這些接口實現根據不同平臺調用不同平臺的操作系統API。

如下圖所示,採用C標準庫編寫的程序可以應用到windows平臺,也可以應用到linux平臺;而用CRT另外與平臺相關的庫函數編寫的應用程序不能跨平臺運行。

 而不同平臺的操作系統API實現,是用C標準庫呢,還是彙編呢,這個可有,可沒有。畢竟那麼多windows API只要發現一個調用C標準庫的了,就有了。概念理解了即可,至於微軟實現的時候基於何種考慮不使用C標準庫,或者使用C標準庫都有自己的考慮。那就是操作系統內部的研究範圍了,等我知道了之後再確定這點。哈哈。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章