C/C++运行库简介
什么是C/C++運(yùn)行庫(kù)
任何一個(gè)C 程序,它的背后都有一套龐大的代碼來(lái)進(jìn)行支撐,以使得該程序能夠正常運(yùn)行。這套代碼至少包括入口函數(shù),及其所依賴的函數(shù)所構(gòu)成的函數(shù)集合。另外包括各種標(biāo)準(zhǔn)庫(kù)函數(shù)的實(shí)現(xiàn)。
這樣的一個(gè)代碼集合稱之為運(yùn)行時(shí)庫(kù)(Runtime Library),C 語(yǔ)言的運(yùn)行時(shí)庫(kù),稱為 C 運(yùn)行庫(kù)(CRT)。
C 運(yùn)行庫(kù)大致包含的功能:
1. 啟動(dòng)與退出函數(shù)
2. 由C 語(yǔ)言標(biāo)準(zhǔn)規(guī)定的C 語(yǔ)言標(biāo)準(zhǔn)庫(kù)所擁有的函數(shù)實(shí)現(xiàn)。
3. I/O 功能的封裝與實(shí)現(xiàn)。
4. 堆的封裝和實(shí)現(xiàn)
5. 語(yǔ)言中一些特殊功能的實(shí)現(xiàn)。
6. 實(shí)現(xiàn)調(diào)試功能的代碼。
運(yùn)行庫(kù)是平臺(tái)相關(guān)的,C 語(yǔ)言的運(yùn)行庫(kù)從某種程度上說(shuō)是C 語(yǔ)言的程序和不同操作系統(tǒng)平臺(tái)之間的抽象層,將不同的操作系統(tǒng)API 抽象成了相同的庫(kù)函數(shù)。但是C 運(yùn)行庫(kù)的功能畢竟有限,比如創(chuàng)建線程等操作,不同的操作系統(tǒng)完全不同。我們不得不通過(guò)其它的方法,繞過(guò)C 語(yǔ)言運(yùn)行庫(kù)直接調(diào)用操作系統(tǒng)API 或使用其它的庫(kù)。Linux 和 Windows 平臺(tái)下兩個(gè)主要C 語(yǔ)言的運(yùn)行庫(kù)分別為glibc 和 MSVCRT。像線程操作這樣的功能,雖然不是標(biāo)準(zhǔn)C 語(yǔ)言運(yùn)行庫(kù)的一部分,也現(xiàn)在兩個(gè)庫(kù)中,因此glibc 和 MSVCRT 事實(shí)上是標(biāo)準(zhǔn)C 語(yǔ)言運(yùn)行庫(kù)的超集。
每個(gè)編譯器通常實(shí)現(xiàn)了標(biāo)準(zhǔn)C的超集,稱為C運(yùn)行時(shí)庫(kù)(C Run-Time Library)。
C run-time Library包含了C程序運(yùn)行的最基本和最常用的函數(shù),沒(méi)有C run-time Library則main()函數(shù)不會(huì)被調(diào)用,exit()也不能被響應(yīng)。C運(yùn)行庫(kù)與平臺(tái)相關(guān)。
到了C++的世界,有了另外一個(gè)概念:Standard C++ Library。因?yàn)镃++是C的超集,所以Standard C++ Library包括了C run-time Library和STL。
VC++針對(duì)C++ 加入的Standard C++ Library主要包括:libcp.lib、libcpmt.lib、msvcprt.lib。
在windows環(huán)境下,VC++提供的C Run-Time Library又分為動(dòng)態(tài)運(yùn)行時(shí)庫(kù)和靜態(tài)運(yùn)行時(shí)庫(kù)。
動(dòng)態(tài)運(yùn)行時(shí)庫(kù)主要是DLL庫(kù)文件msvcrt.dll(vc 6.0,之后是msvcr100.dll等),靜態(tài)運(yùn)行時(shí)庫(kù)對(duì)應(yīng)的主要文件是libc.lib(Single thread static library, retail version) 、LIBCMT.LIB (Multithread static library, retail version) 。msvcrt.dll運(yùn)行時(shí)庫(kù)提供幾千個(gè)C函數(shù),包括printf,程序運(yùn)行時(shí)很大部分時(shí)間都是在這些運(yùn)行庫(kù)中。到底使用哪些庫(kù)取決于你的編譯器及編譯選項(xiàng):/MT、/MTd、/MD、/MDd。
/MT、/MTd、/MD、/MDd各選項(xiàng)區(qū)別
1. MT選項(xiàng):鏈接LIB版的C和C++運(yùn)行庫(kù)。在鏈接時(shí)就會(huì)在將C和C++運(yùn)行時(shí)庫(kù)(LIBCMT.LIB、LIBC.LIB)集成到程序中,程序體積會(huì)變大。
2. MTd選項(xiàng):LIB的調(diào)試版。
3. MD選項(xiàng):使用DLL版的C和C++運(yùn)行庫(kù),這樣在程序運(yùn)行時(shí)會(huì)動(dòng)態(tài)的加載對(duì)應(yīng)的DLL,程序體積會(huì)減小,缺點(diǎn)是在系統(tǒng)沒(méi)有對(duì)應(yīng)DLL時(shí)程序無(wú)法運(yùn)行(需添加MSVCPxx.DLL、MSVCRxx.DLL)。
4. MDd選項(xiàng):表示使用DLL的調(diào)試版。
CRT 為支持多線程所做的改進(jìn)
1. 使用TLS,TLS 即線程局部存儲(chǔ),多線程環(huán)境下,設(shè)置錯(cuò)誤代碼時(shí)將值設(shè)置到TLS 中,以免引起混亂。
2. 加鎖,線程不安全的函數(shù)內(nèi)部自動(dòng)加鎖,包括malloc printf 等。
3. 改進(jìn)函數(shù)調(diào)用方式,比如strtok 函數(shù)內(nèi)部實(shí)現(xiàn)使用了一個(gè)char* 類型的靜態(tài)局部變量,新版本將添加一個(gè)char* 指針參數(shù),替代原來(lái)的靜態(tài)局部變量的功能,但同時(shí),使用此函數(shù)的源代碼需要進(jìn)行相應(yīng)的修改。
運(yùn)行庫(kù)職責(zé)的主要流程:
1.初始化和操作系統(tǒng)版本有關(guān)的全局變量
2.初始化堆
3.初始化I/O
4.獲取命令行參數(shù)和環(huán)境變量
5.初始化C庫(kù)的一些數(shù)據(jù)
6.調(diào)用mian并記錄返回值
7.檢查錯(cuò)誤并將main的返回值返回
在《win32多線程程序設(shè)計(jì)》中強(qiáng)調(diào):
如果主線程以外的任何線程進(jìn)行以下操作,你就應(yīng)該使用多線程版的 runtime library,并使用 beginthreadex0和
endthreadex
1. 在C程序中使用 malloco和free或是在C程序中使用new和 delete,
2. 調(diào)用 stdio.h或io.h中聲明的任何函數(shù),包括像 fopen、open、getchar、 write、 printfo等等。所有這些函數(shù)都用到共享的數(shù)據(jù)結(jié)構(gòu)以及 errno你可以使用 wsprintf將字符串格式化,如此就不需要 stdio了,如果鏈接器抱怨說(shuō)它找不到 wsprintf你得鏈接USR32.lib
3. 使用浮點(diǎn)變量或浮點(diǎn)運(yùn)算函數(shù)
4. 調(diào)用任何一個(gè)使用了靜態(tài)緩沖區(qū)的 runtime函數(shù),如 asctime, strtok或 rand
參考:https://blog.csdn.net/qq_18218335/article/details/74784587
https://blog.csdn.net/lwwl12/article/details/77045717
總結(jié)
以上是生活随笔為你收集整理的C/C++运行库简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VC中为对话框添加背景图片
- 下一篇: s3c2440移植MQTT