c运行库、c标准库、windows API都是什么玩意
c運行庫、c標準庫、windows API都是什么玩意
2012-11-28 14:37 768人閱讀 評論(2) 收藏 舉報C運行庫和C標準庫的關(guān)系
C標準庫,顧名思義既然是標準,就是由標準組織制定的。是由“美國國家標準協(xié)會(American National Standards Institute,ANSI)”為了規(guī)范C語言庫而制定的標準。在最初,各個大學各個公司使用的C語言庫都不盡相同,造成相互移植非常困難,在這個背景下,制定了這個標準。
C運行庫,是和平臺相關(guān)的,即和操作系統(tǒng)相關(guān)的。它由不同操作系統(tǒng)不同開發(fā)平臺提供不同的C運行庫。但是C運行庫的部分實現(xiàn)是基于C標準庫的,即C運行庫是各個操作系統(tǒng)各個開發(fā)工具根據(jù)自身平臺開發(fā)的庫,某種程度上,可以說C運行庫是C標準庫的一個擴展庫,只是加了很多C標準庫所沒有的與平臺相關(guān)的或者不相關(guān)的庫接口函數(shù)。舉例子如:c標準庫的strcpy函數(shù)負責字符串的拷貝,但是由于缺少對目地字符串緩沖區(qū)大小的控制,極有可能導致緩沖區(qū)溢出(大量的緩沖區(qū)溢出攻擊都是由于這種漏洞而產(chǎn)生的);相反,Windows提供了能夠?qū)崿F(xiàn)同樣功能的安全的字符串拷貝函數(shù),減少了緩沖區(qū)攻擊的可能,strcpy_s。這些函數(shù)是以c運行庫的方式提供的,當然,不同的操作系統(tǒng),c運行時庫可能不同,但是對c標準庫的支持是完全一致的,也就是說,在不同的操作系統(tǒng)上,使用同一個c標準庫的函數(shù)必然產(chǎn)生一致的結(jié)果。
C標準庫中提供的有:
l?????????? 標準輸入輸出(stdio.h)。
l?????????? 文件操作(stdio.h)。
l?????????? 字符操作(ctype.h)。
l?????????? 字符串操作(string.h)。
l?????????? 數(shù)學函數(shù)(math.h)。
l?????????? 資源管理(stdlib.h)。
l?????????? 格式轉(zhuǎn)換(stdlib.h)。
l?????????? 時間/日期(time.h)。
l?????????? 斷言(assert.h)。
l?????????? 各種類型上的常數(shù)(limits.h & float.h)。
你寫的程序可以沒有math庫,程序照樣運行,只是不能處理復雜的數(shù)學運算,不過如果沒有了C?? run-time庫,main()就不會被調(diào)用,exit()也不能被響應。因為C?? run-time?? library包含了C程序運行的最基本和最常用的函數(shù)。??
如下是C運行庫與C標準庫的關(guān)系:
一個C運行庫大致包含了如下功能:
l?????????? 啟動與退出:包括入口函數(shù)及入口函數(shù)所依賴的其他函數(shù)等。
l?????????? 標準函數(shù):由C語言標準規(guī)定的C語言標準庫所擁有的函數(shù)實現(xiàn)。(C標準庫)
l?????????? I/O:I/O功能的封裝和實現(xiàn),參見上一節(jié)中I/O初始化部分。
l?????????? 堆:堆的封裝和實現(xiàn),參見上一節(jié)中堆初始化部分。
l?????????? 語言實現(xiàn):語言中一些特殊功能的實現(xiàn)。
l?????????? 調(diào)試:實現(xiàn)調(diào)試功能的代碼。
操作系統(tǒng)API和C運行庫CRT,C標準庫之間
首先,C語言要早于Windows出現(xiàn),而且C語言實際標準制定的開始時間也要早于Windows(API概念出現(xiàn)的)系統(tǒng)的開發(fā)時間。所以Windows系統(tǒng)在開發(fā)的時候是完全可以使用C語言的。目前最多的說法是用C和匯編實現(xiàn)的。那么只要用C,就可能用C標準庫。
我們假設(shè)兩種情況,一是Windows API的實現(xiàn)包含部分C標準庫函數(shù)的功能實現(xiàn),這就決定了這部分操作系統(tǒng)API的實現(xiàn)是由調(diào)用標準庫實現(xiàn)的,那么在發(fā)布時需要加入所用到的c標準庫DLL一同發(fā)布。
?二是微軟的內(nèi)核(包括API)開發(fā)是使用著一個和平臺嚴格相關(guān)的C語言的靜態(tài)的鏈接庫,這樣不必提供Dll也能開發(fā)和發(fā)行。而且必然的這個C庫是在匯編的基礎(chǔ)上實現(xiàn)的,也就是說這個庫里面的C函數(shù)都是(至少有很大比例)披著C語法的匯編代碼。
要你是微軟,你選擇哪個呢?也許是兩者兼而有之,也許是后者。
一般情況下,我們說C運行庫暗含的意思是哪種平臺哪個開發(fā)平臺的C運行庫,
CRT的實現(xiàn)是基于Windows API的,而WindowsAPI的開發(fā)也是基于C語言的,但不是或者不一定基于CRT(或者C標準庫)的。
再深一步,雖然CRT是基于操作系統(tǒng) API實現(xiàn)的,但并不代表所有的CRT封裝了操作系統(tǒng) API,如一些用戶的權(quán)限控制,操作系統(tǒng)線程創(chuàng)建等都不屬于C運行庫,于是對于這些操作我們就不得不直接調(diào)用操作系統(tǒng)API或者其他庫。
總結(jié)一下,C標準庫就是任何平臺都可以使用的基本C語言庫。而CRT除了將C標準庫加入所屬范圍外,還擴展了與平臺相關(guān)的接口庫,這些接口實現(xiàn)根據(jù)不同平臺調(diào)用不同平臺的操作系統(tǒng)API。
如下圖所示,采用C標準庫編寫的程序可以應用到windows平臺,也可以應用到linux平臺;而用CRT另外與平臺相關(guān)的庫函數(shù)編寫的應用程序不能跨平臺運行。
?而不同平臺的操作系統(tǒng)API實現(xiàn),是用C標準庫呢,還是匯編呢,這個可有,可沒有。畢竟那么多windows API只要發(fā)現(xiàn)一個調(diào)用C標準庫的了,就有了。概念理解了即可,至于微軟實現(xiàn)的時候基于何種考慮不使用C標準庫,或者使用C標準庫都有自己的考慮。那就是操作系統(tǒng)內(nèi)部的研究范圍了,等我知道了之后再確定這點。哈哈。。。。。。
總結(jié)
以上是生活随笔為你收集整理的c运行库、c标准库、windows API都是什么玩意的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享录制的几个 Adobe Illust
- 下一篇: 写python的c扩展简介