C運行時庫函數是指C語言本身支持的壹些基本函數,通常直接用匯編實現。
API函數
API函數是操作系統為了方便用戶設計應用而提供的實現特定功能的函數,API函數也是通過C語言的函數來實現的。
區分
兩者的區別在於API函數是針對操作系統的,而C語言運行時函數是針對C語言本身的。
1.運行時庫是C運行時庫,是C語言世界而不是C++的概念。
妳得到這個名字是因為妳的C程序在運行時需要這些庫中的函數。
2.c語言是所謂的“小內核”語言,本身就很小(很少的關鍵詞,程序流程控制,數據類型等。);
因此,丹尼斯·裏奇(Dennis Ritchie)和布萊恩·柯尼根(Brian Kernighan)在開發出C語言內核後,用C本身重寫了90%以上的UNIX系統。
函數,並將最常用的部分分離出來,形成頭文件和相應的庫,比如C運行時庫。
形成了。
3.隨後,隨著C語言的流行,C編譯器的廠商/個人/團體都沿襲了舊的傳統,他們都在不同的平臺上通信。
但是大多數實現都與各種平臺相關。因為各種C編譯器對C有很多支持和了解。
差異和細微差別,所以有ANSI C;;ANSI C(主觀上)詳細規定了C語言各元素的具體含義。
建立了標準庫的標準形式。所以當c運行時。
該庫由編譯器制造商提供。至於其他廠商/個人/團體提供的頭文件和庫函數,應該叫第三方C運行時庫。
(第三方C運行時庫).
4.C運行時庫包含初始化代碼和錯誤處理代碼(例如被零除處理)。妳寫的程序
沒有數學庫也可以運行程序,但是不能處理復雜的數學運算。但是如果沒有C運行時庫,main()。
它不會被調用,exit()也不會被響應。因為C運行時庫包含了最基本最常用的C程序。
功能。
5.在C++的世界裏,還有壹個概念:標準C ++庫,包括上面提到的C運行時庫。
還有STL。包含C運行時庫的原因很明顯。C++是C的超集,沒有理由再次啟動C++運行時。
圖書館.VC為C++添加的標準c++庫主要有:LIBCP。LIB,LIBCPMT。LIB和MSVCPRT。解放運動
6.在Windows環境下,VC提供的C運行時庫可以分為動態運行時庫和靜態運行時庫。
動態運行時庫
動態運行時庫主要包括:
DLL庫文件:msvcrt.dll(或調試版本的MSVCRTD.DLL)
對應的導入庫文件:MSVCRT。LIB(或MSVCRTD。調試版本庫)
靜態運行時庫
對應於靜態運行時庫(發布版本)的主要文件包括:
LIBC。單線程靜態庫,零售版
LIBCMT。多線程靜態庫,零售版
Msvcrt.dll提供了數以千計的C函數,甚至像printf這樣的低級函數都在msvcrt.dll。事實上,當妳的程序運行時,很大壹部分時間是在這些庫中運行的。當妳的程序(發布版)編譯時,VC會根據妳的編譯選項(單線程、多線程或DLL)自動鏈接相應的運行時庫文件(libc.lib、libcmt.lib或導入庫msvcrt.lib)。
2.C運行時庫的作用
除了為我們提供必要的庫函數調用(如memcpy、printf、malloc等。),C運行庫提供的另壹個最重要的功能是為應用程序添加啟動函數。
C運行時庫啟動函數的主要作用是初始化程序,給全局變量賦初始值,加載用戶程序的入口函數。
不使用寬字符集的控制臺程序的入口點是mainCRTStartup(void)。下面就以這個函數為例,分析壹下運行時庫給我們增加了什麽樣的入口程序。這個函數是在crt0.c中定義的,下面的代碼經過作者的整理和簡化:
void mainCRTStartup(void)
{
int mainret
/*獲取WIN32的完整版本信息*/
_ OS ver = GetVersion();
_ winminor =(_ OS ver & gt;& gt8)& amp;0x 00 ff;
_ winmajor = _ osver & amp0x 00 ff;
_ winver =(_ win major & lt;& lt8)+_ winminor;
_ OS ver =(_ OS ver & gt;& gt16);0x00FFFF
_ ioinit();/*初始化lowio */
/*獲取命令行信息*/
_ ACM dln =(char *)GetCommandLineA();
/*獲取環境信息*/
_ aenvptr =(char *)_ _ crtgetenvenmentstringsa();
_ setargv();/*設置命令行參數*/
_ setenvp();/*設置環境參數*/
_ cinit();/* C數據初始化:全局變量初始化,就在這裏!*/
_ _ initenv = _ environ
mainret = main( __argc,__argv,_ environ);/*調用主函數*/
退出(mainret);
}
從上面的代碼可以看出,運行時在調用用戶程序的main或WinMain函數之前,已經做了壹些初始化工作。初始化完成後,調用我們寫的main或WinMain函數。只有這樣,我們的C語言運行庫和應用程序才能正常工作。
除了crt0.c,C運行時庫還包含wcrt0.c、wincrt0.c、wwincrt0.c三個文件,提供初始化函數。Wcrt0.c是crt0.c的寬字符集版本,wincrt0.c包含windows應用程序的入口函數,wwincrt0.c是wincrt0.c的寬字符集版本..
默認情況下,不安裝Visual C++的運行時庫源代碼。如果要查看其源代碼,需要重新安裝Visual C++,並在重新安裝時勾選安裝運行時源代碼的選項。
讓我們看壹個沒有正確使用C運行時庫的控制臺程序:
#包括
#包括
int main()
{
CFile文件;
CString str("我愛妳");
嘗試
{
文件。Open("file.dat ",CFile::mode write | CFile::mode create);
}
捕捉(CFileException,e)
{
#ifdef _DEBUG
afxDump & lt& lt“文件無法打開”& lt& lte-& gt;m _ cause & lt& lt”\ n”;
#endif
}
結束_捕捉
文件。寫(str,str。GetLength());
文件。close();
}
“全部重建”時出現鏈接錯誤:
nafxcwd.lib(thrdcore.obj):錯誤LNK2001:未解析的外部符號__endthreadex
nafxcwd.lib(thrdcore.obj):錯誤LNK2001:未解析的外部符號__beginthreadex
main.exe:致命錯誤LNK1120: 2個未解決的外部錯誤
執行cl.exe時出錯。
錯誤的原因是Visual C++默認情況下對控制臺程序使用單線程靜態鏈接庫,而MFC中的CFile類隱藏了多個線程。我們只需要在Visual C++6.0中點擊項目->即可。設置-& gt;C/C++菜單和選項,只需在項目選項中修改編譯選項即可。
c運行時與c標準庫的關系
c標準庫,顧名思義,就是標準,是由標準組織制定的。是美國國家標準協會(ANSI)為規範C語言庫而制定的標準。當初每個大學和公司用的C語言庫都不壹樣,互相移植起來非常困難。在此背景下,制定了本標準。
c運行時是平臺相關的,也就是操作系統相關的。它由不同的操作系統和不同的開發平臺提供不同的C運行時庫。但是C-runtime的部分實現是基於C-standard庫的,即C-runtime是各種操作系統的各種開發工具根據自己的平臺開發的庫。某種程度上可以說C-runtime是C-standard庫的擴展庫,但是增加了很多C-standard庫中沒有的平臺相關或者無關的庫接口函數。比如C標準庫的strcpy函數,負責復制字符串,但是由於缺乏對目的stringbuffer區域大小的控制,極有可能導致緩沖區溢出(大量的緩沖區溢出攻擊就是由這個漏洞造成的);相反,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 (assert.h)。
各種類型的l常數(極限。h &;float.h).
妳寫的程序沒有數學庫也能運行,但是不能處理復雜的數學運算。但是,如果沒有C運行時庫,就不會調用main(),也不會響應exit()。因為C運行時庫包含了C程序最基本最常用的函數。
下面是C運行時和C標準庫之間的關系:
C運行時庫大致包括以下函數:
l啟動和退出:包括入口函數和入口函數所依賴的其他函數。
l標準函數:由C語言標準規定的C語言標準庫所擁有的函數實現。(c標準庫)
L I/O:有關I/O函數的封裝和實現,請參見上壹節中的I/O初始化部分。
L heap:關於heap的封裝和實現,請參見上壹節中的heap初始化部分。
語言實現:語言中壹些特殊功能的實現。
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 runtime就是哪個平臺,哪個開發平臺的C runtime。
CRT的實現是基於WindowsAPI的,Windows API的開發也是基於C語言的,但不是或者不壹定是基於CRT(或者C標準庫)。
此外,盡管CRT是基於操作系統API實現的,但這並不意味著所有CRT都封裝了操作系統API。比如有些用戶的權限控制和操作系統線程創建不屬於C運行時庫,我們就要直接調用操作系統API或者其他庫來進行這些操作。
綜上所述,C標準庫是基本的C語言庫,任何平臺都可以使用。CRT除了在其範圍內增加了C標準庫,還擴展了與平臺相關的接口庫,可以根據不同的平臺調用不同平臺的操作系統API。
如下圖所示,用C標準庫寫的程序,既適用於windows平臺,也適用於linux平臺。但是,用CRT的其他平臺相關庫函數編寫的應用程序不能跨平臺運行。