簡(jiǎn)要介紹編寫C/C ++應(yīng)用程序的領(lǐng)域,標(biāo)準(zhǔn)庫(kù)的作用以及它是如何在各種操作系統(tǒng)中實(shí)現(xiàn)的。
我已經(jīng)接觸C++一段時(shí)間了,一開(kāi)始就讓我感到疑惑的是其內(nèi)部結(jié)構(gòu):我所使用的內(nèi)核函數(shù)和類從何而來(lái)? 誰(shuí)發(fā)明了它們? 他們是打包在我系統(tǒng)中的某個(gè)地方嗎? 是否存在一份官方的C ++手冊(cè)?
在本文中,我將通過(guò)從C和C ++語(yǔ)言的本質(zhì)到實(shí)際實(shí)現(xiàn)來(lái)嘗試回答這些問(wèn)題。
C和C++是如何制訂的
當(dāng)我們談?wù)揅和C++時(shí),實(shí)際上是指一組定義(程序)語(yǔ)言應(yīng)該做些什么,如何表現(xiàn),應(yīng)該提供哪些功能的規(guī)則。C/C++的編譯器為了處理C/C++編寫的源代碼必須跟隨著這些規(guī)則,并生成二進(jìn)制應(yīng)用程序。聽(tīng)起來(lái)非常接近于HTML:瀏覽器遵循著一組指令,所以它們可以以明確的方式來(lái)渲染網(wǎng)頁(yè)。
與HTML一樣,C和C++的規(guī)則都是理論上的。國(guó)際標(biāo)準(zhǔn)化組織(ISO)的一大群人每年都會(huì)聚集幾次來(lái)討論和定義語(yǔ)言規(guī)則。沒(méi)錯(cuò),C和C++是標(biāo)準(zhǔn)化的東西。他們最終都會(huì)得到一本官方的叫標(biāo)準(zhǔn)的書,你可以從他們的網(wǎng)站中購(gòu)買。隨著語(yǔ)言的發(fā)展新的papers(指官方的叫標(biāo)準(zhǔn)的書)會(huì)被發(fā)布,每一次都定義一個(gè)新的標(biāo)準(zhǔn)。這就是為什么我們會(huì)有不同的C和C++版本的原因:C99, C11, C++03, C++11, C++14等等,數(shù)字與出版/發(fā)布年份相符。
這些標(biāo)準(zhǔn)都市非常詳細(xì)和有技術(shù)新的文檔:我不會(huì)把它們當(dāng)作手冊(cè)。通常會(huì)分為兩部分:
1.C/C++的功能和特性;
2.C/C++的API--開(kāi)發(fā)人員可以用于他們的C/C++程序的一個(gè)類、函數(shù)和宏的集合。它也被稱為標(biāo)準(zhǔn)庫(kù)。
例如,這里有個(gè)來(lái)自于C標(biāo)準(zhǔn)庫(kù)第一部分的摘選,它定義了main函數(shù)的結(jié)構(gòu):
1.main的定義,程序啟動(dòng)時(shí)調(diào)用的函數(shù)。
這是另外一個(gè)來(lái)自與同樣標(biāo)準(zhǔn)的摘錄,描述了CAPI的成員--fmin函數(shù):
2.在math.h偷文件中定義min函數(shù)。
如你所見(jiàn),幾乎沒(méi)涉及到代碼。有人必須閱讀標(biāo)準(zhǔn)并將其轉(zhuǎn)換成計(jì)算機(jī)可以消化的東西。這是工作于編譯器和(功能)實(shí)現(xiàn)上人們所做的:前者是一種可以讀取和處理C和c++源文件的工具,后者將標(biāo)準(zhǔn)庫(kù)轉(zhuǎn)換為代碼。我們來(lái)深入了解一下。。
C標(biāo)準(zhǔn)庫(kù)
C標(biāo)準(zhǔn)庫(kù)也稱為ISO C庫(kù),是用于完成諸如輸入/輸出處理、字符串處理、內(nèi)存管理、數(shù)學(xué)計(jì)算和許多其他操作系統(tǒng)服務(wù)等任務(wù)的宏、類型和函數(shù)的集合。它是在C標(biāo)準(zhǔn)中(例如C11標(biāo)準(zhǔn))中定義的。其內(nèi)容分布在不同的頭文件中,比如上面我所提到的math.h。
C++標(biāo)準(zhǔn)庫(kù)
和C標(biāo)準(zhǔn)庫(kù)的概念類似,但僅針對(duì)C ++。C++標(biāo)準(zhǔn)庫(kù)是一組C++模板類,它提供了通用的編程數(shù)據(jù)結(jié)構(gòu)和函數(shù),如鏈表、堆、數(shù)組、算法、迭代器和任何其他你可以想到的C++組件。C ++標(biāo)準(zhǔn)庫(kù)也包含了C標(biāo)準(zhǔn)庫(kù),并在C++標(biāo)準(zhǔn)中進(jìn)行了定義(例如C++ 11標(biāo)準(zhǔn))。
實(shí)現(xiàn)C/C++標(biāo)準(zhǔn)庫(kù)
我們從這里開(kāi)始討論真正的代碼了。從事于標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)的開(kāi)發(fā)者閱讀官方的ISO規(guī)范并將其轉(zhuǎn)化為代碼。他們必須依賴其操作系統(tǒng)所提供的功能(讀/寫文件,分配內(nèi)存,創(chuàng)建線程,......所有這些被稱為系統(tǒng)調(diào)用),因此每個(gè)平臺(tái)都有其自己的標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)。 有時(shí)它是系統(tǒng)內(nèi)核的一部分,有時(shí)它是作為一個(gè)附加組件 - 編譯器 - 必須單獨(dú)下載。
GNU/Linux版實(shí)現(xiàn)
GNU C庫(kù),也稱為glibc, 是C標(biāo)準(zhǔn)庫(kù)的GNU項(xiàng)目實(shí)現(xiàn)。并非所有的標(biāo)準(zhǔn)C函數(shù)都可以在glibc中找到:大多數(shù)數(shù)學(xué)函數(shù)實(shí)際上是在libm庫(kù)中實(shí)現(xiàn)的,這是一個(gè)獨(dú)立的庫(kù)。
截至今天,glibc是Linux上使用最廣泛的C庫(kù)。 然而,在90年代期間,有一段時(shí)間里,glibc有一個(gè)競(jìng)爭(zhēng)對(duì)手稱為L(zhǎng)inux libc(或者簡(jiǎn)稱libc),它是由glibc 1.x的一個(gè)分支產(chǎn)生的。在一段時(shí)間里,Linux libc是許多Linux發(fā)行版中的標(biāo)準(zhǔn)C庫(kù)。
經(jīng)過(guò)多年的發(fā)展,glibc竟然比Linux libc更具優(yōu)勢(shì),并且所有使用它的Linux發(fā)行版都切換回了glibc。所以,如果你在你的磁盤中找到一個(gè)名為libc.so.6的文件,請(qǐng)不要擔(dān)心:它是現(xiàn)代版的glibc。為了避免與之前的Linux libc版本混淆,版本號(hào)增加到了6(他們無(wú)法將其命名為glibc.so.6:所有Linux庫(kù)都必須以lib前綴打頭)。
另一方面,C++標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)位于libstdc++或GNU標(biāo)準(zhǔn)C++庫(kù)中。這是一個(gè)正在進(jìn)行的在GNU/Linux上實(shí)現(xiàn)標(biāo)準(zhǔn)C++庫(kù)的項(xiàng)目。一般來(lái)說(shuō),所有常規(guī)的Linux發(fā)行版都默認(rèn)使用libstdc++。
Mac和iOS版實(shí)現(xiàn)
在Mac和iOS上,C標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)是libSystem的一部分,libSystem是位于/usr/lib/libSystem.dylib中的核心庫(kù)。LibSystem包含其他組件,如數(shù)學(xué)庫(kù)、線程庫(kù)和其他底層實(shí)用程序。
關(guān)于C++標(biāo)準(zhǔn)庫(kù),在OS X Mavericks(V10.9)之前的Mac上,libstdc++是默認(rèn)選項(xiàng)。這在現(xiàn)代的基于Linux的系統(tǒng)上可以找到的同樣的實(shí)現(xiàn)。自O(shè)S X Mavericks開(kāi)始,Apple切換到使用libc++,這是LLVM項(xiàng)目——Mac官方編譯器框架——所引入的GNU libstdc++標(biāo)準(zhǔn)庫(kù)的替代。
IOS開(kāi)發(fā)者可以使用iOS SDK(軟件開(kāi)發(fā)工具包)來(lái)訪問(wèn)標(biāo)準(zhǔn)庫(kù),它是一系列允許創(chuàng)建移動(dòng)應(yīng)用程序的工具。
Windows版實(shí)現(xiàn)
在Windows上,標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)一直嚴(yán)格限定在Visual Studio中,它是微軟官方的編譯器。他們通常稱之為C/C++運(yùn)行時(shí)庫(kù)(CRT),并且它涵蓋了c/c++二者的實(shí)現(xiàn)。
在最開(kāi)始,CRT被實(shí)現(xiàn)為CRTDLL.DLL庫(kù)(我猜,當(dāng)時(shí)沒(méi)有可用的C++標(biāo)準(zhǔn)庫(kù))。從Windows 95開(kāi)始,Microsoft開(kāi)始將其遷移到MSVCRT [版本號(hào)].DLL(MSVCR20.DLL,MSVCR70.DLL等)之上,據(jù)推測(cè)也包含C++標(biāo)準(zhǔn)庫(kù)。在1997年左近,他們決定將文件名簡(jiǎn)化為MSVCRT.DLL,這不幸導(dǎo)致了令人討厭的DLL混亂。這就是為什么從Visual Studio 7.0版開(kāi)始,他們切換回每個(gè)版本使用單獨(dú)的DLL了。
Visual Studio 2015引入了深度的CRT重構(gòu)。C/C ++標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)遷移到一個(gè)新庫(kù),Universal C運(yùn)行時(shí)庫(kù) (Universal CRT或UCRT),編譯為UCRTBASE.DLL。 UCRT目前已經(jīng)成為Windows組之一,從Windows 10開(kāi)始作為操作系統(tǒng)的一部分提供。
Android版實(shí)現(xiàn)
Bionic是Google為其Android操作系統(tǒng)所編寫的C標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn),它直接在底層使用。 第三方開(kāi)發(fā)者可以通過(guò)Android原生開(kāi)發(fā)工具包(NDK)訪問(wèn)Bionic,該工具集允許你使用C和C++代碼編寫Android應(yīng)用程序。
在 C++ 端, NDK提供了很多版本的實(shí)現(xiàn):
libc++,從從Lollipop開(kāi)始的官方安卓系統(tǒng)和現(xiàn)代Mac操作系統(tǒng)都將其作為C++標(biāo)準(zhǔn)庫(kù)使用。從NDK發(fā)布17版本開(kāi)始,它將成為NDK中唯一可用的C++標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn);
gnustl,libstdc++的別名,這兩者在GNU/linux是同一個(gè)庫(kù)。這個(gè)庫(kù)的已被棄用,它將在NDK發(fā)布18中刪除;
STLport,由STLport項(xiàng)目編寫的C++標(biāo)準(zhǔn)庫(kù)的第三方實(shí)現(xiàn),自2008年以來(lái)一直處于不活躍狀態(tài)。與gnustl一樣,STLport將在NDK發(fā)布18中移除。
我能使用不同版本的實(shí)現(xiàn)代碼來(lái)替代默認(rèn)實(shí)現(xiàn)嗎?
如果你正在使用資源非常有限的系統(tǒng),則通常需要引用C標(biāo)準(zhǔn)庫(kù)的不同實(shí)現(xiàn)。比如,uClibc-ng, musl libc和diet libc等等,所有這些都適用于嵌入式Linux系統(tǒng)的開(kāi)發(fā),提供更小的二進(jìn)制文件和更少的內(nèi)存占用。
C++標(biāo)準(zhǔn)庫(kù)也有不同的實(shí)現(xiàn)版本:Apache C++標(biāo)準(zhǔn)庫(kù),uSTL以及EASTL等等。后面兩個(gè)實(shí)際上僅關(guān)注模板部分,而不是完整的庫(kù),并且他們是在速度優(yōu)先的情況下開(kāi)發(fā)的。Apache版本的庫(kù)注重的是可移植性。
如果我們脫離了標(biāo)準(zhǔn)庫(kù)怎么辦?
不使用標(biāo)準(zhǔn)庫(kù)很簡(jiǎn)單:只要在你的程序中不引入它們的任何一個(gè)頭文件,你的工作就完成了。然而,為了讓這個(gè)操作更有意義一些,你需要通過(guò)一些提供的系統(tǒng)調(diào)用使用某種方法與操作系統(tǒng)互動(dòng)。就像我之前說(shuō)的,這就是標(biāo)準(zhǔn)庫(kù)中的函數(shù)/方法在底層實(shí)現(xiàn)的時(shí)候所使用的。很可能你也會(huì)不得不調(diào)用這些方法來(lái)與硬件設(shè)備交互。
如果對(duì)你來(lái)說(shuō)這聽(tīng)起來(lái)很讓人激動(dòng),有些人已經(jīng)開(kāi)始在網(wǎng)上嘗試在不導(dǎo)入標(biāo)準(zhǔn)庫(kù)的情況下創(chuàng)建工作流程。因?yàn)槟阋蕾囉谝粋€(gè)特定操作系統(tǒng)所提供的函數(shù),這種方式會(huì)喪失可移植性。然而通過(guò)使用這種艱難的方式,肯會(huì)讓你學(xué)到更多,而且讓你更好的理解當(dāng)你所做的事情,即使是在使用高級(jí)庫(kù)的時(shí)候。
除了知識(shí),當(dāng)你在嵌入式操作系統(tǒng)上面工作的時(shí)候你不會(huì)想去引入標(biāo)準(zhǔn)庫(kù):因?yàn)榇a不需要移植,在有限的內(nèi)存中每個(gè)字節(jié)都很重要,這會(huì)讓你更加精準(zhǔn)的寫代碼。另一個(gè)使用背景就是demoscene,在這里人們盡量有限的程序的二進(jìn)制大小中去保留高質(zhì)量的音視頻——4K仍然不是最小值:一些demoparties使用1K,256字節(jié),64字節(jié)或者甚至32字節(jié)來(lái)競(jìng)爭(zhēng)。在那里不允許使用標(biāo)準(zhǔn)庫(kù)!
最后,學(xué)習(xí)從來(lái)不是一個(gè)人的事情,要有個(gè)相互監(jiān)督的伙伴,對(duì)于C/C++感興趣可以關(guān)注小編在后臺(tái)私信我:【編程】一起來(lái)學(xué)習(xí)哦!可以領(lǐng)取一些C/C++的項(xiàng)目學(xué)習(xí)視頻資料哦!已經(jīng)設(shè)置好了關(guān)鍵詞自動(dòng)回復(fù),自動(dòng)領(lǐng)取就好了
本文發(fā)布于:2023-02-28 20:01:00,感謝您對(duì)本站的認(rèn)可!
本文鏈接:http://www.newhan.cn/zhishi/a/167764953374062.html
版權(quán)聲明:本站內(nèi)容均來(lái)自互聯(lián)網(wǎng),僅供演示用,請(qǐng)勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。
本文word下載地址:msvcrt.dll(msvcrt.dll修復(fù)工具).doc
本文 PDF 下載地址:msvcrt.dll(msvcrt.dll修復(fù)工具).pdf
| 留言與評(píng)論(共有 0 條評(píng)論) |