簡要介紹編寫C/C ++應(yīng)用程序的領(lǐng)域,標(biāo)準(zhǔn)庫的作用以及它是如何在各種操作系統(tǒng)中實(shí)現(xiàn)的,。 C和C++是如何制訂的當(dāng)我們談?wù)揅和C++時,實(shí)際上是指一組定義(程序)語言應(yīng)該做些什么,,如何表現(xiàn),,應(yīng)該提供哪些功能的規(guī)則。C/C++的編譯器為了處理C/C++編寫的源代碼必須跟隨著這些規(guī)則,,并生成二進(jìn)制應(yīng)用程序,。聽起來非常接近于HTML:瀏覽器遵循著一組指令,所以它們可以以明確的方式來渲染網(wǎng)頁,。 頂 翻譯得不錯哦!
這些標(biāo)準(zhǔn)都市非常詳細(xì)和有技術(shù)新的文檔:我不會把它們當(dāng)作手冊,。通常會分為兩部分: 1.C/C++的功能和特性,; 2.C/C++的API--開發(fā)人員可以用于他們的C/C++程序的一個類、函數(shù)和宏的集合,。它也被稱為標(biāo)準(zhǔn)庫,。 例如,這里有個來自于C標(biāo)準(zhǔn)庫第一部分的摘選,,它定義了main函數(shù)的結(jié)構(gòu): 1.main的定義,,程序啟動時調(diào)用的函數(shù)。 這是另外一個來自與同樣標(biāo)準(zhǔn)的摘錄,,描述了CAPI的成員--fmin函數(shù): 2.在math.h偷文件中定義min函數(shù),。 如你所見,幾乎沒涉及到代碼,。有人必須閱讀標(biāo)準(zhǔn)并將其轉(zhuǎn)換成計(jì)算機(jī)可以消化的東西,。這是工作于編譯器和(功能)實(shí)現(xiàn)上人們所做的:前者是一種可以讀取和處理C和c++源文件的工具,后者將標(biāo)準(zhǔn)庫轉(zhuǎn)換為代碼,。我們來深入了解一下,。。 C標(biāo)準(zhǔn)庫C標(biāo)準(zhǔn)庫也稱為ISO C庫,,是用于完成諸如輸入/輸出處理,、字符串處理、內(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)庫和C標(biāo)準(zhǔn)庫的概念類似,,但僅針對C ++,。C++標(biāo)準(zhǔn)庫是一組C++模板類,它提供了通用的編程數(shù)據(jù)結(jié)構(gòu)和函數(shù),,如鏈表,、堆、數(shù)組、算法,、迭代器和任何其他你可以想到的C++組件,。C ++標(biāo)準(zhǔn)庫也包含了C標(biāo)準(zhǔn)庫,并在C++標(biāo)準(zhǔn)中進(jìn)行了定義(例如C++ 11標(biāo)準(zhǔn)),。
實(shí)現(xiàn)C/C++標(biāo)準(zhǔn)庫我們從這里開始討論真正的代碼了,。從事于標(biāo)準(zhǔn)庫實(shí)現(xiàn)的開發(fā)者閱讀官方的ISO規(guī)范并將其轉(zhuǎn)化為代碼。他們必須依賴其操作系統(tǒng)所提供的功能(讀/寫文件,,分配內(nèi)存,,創(chuàng)建線程,......所有這些被稱為系統(tǒng)調(diào)用),,因此每個平臺都有其自己的標(biāo)準(zhǔn)庫實(shí)現(xiàn),。 有時它是系統(tǒng)內(nèi)核的一部分,有時它是作為一個附加組件 - 編譯器 - 必須單獨(dú)下載,。 GNU/Linux版實(shí)現(xiàn)GNU C庫,,也稱為glibc, 是C標(biāo)準(zhǔn)庫的GNU項(xiàng)目實(shí)現(xiàn)。并非所有的標(biāo)準(zhǔn)C函數(shù)都可以在glibc中找到:大多數(shù)數(shù)學(xué)函數(shù)實(shí)際上是在libm庫中實(shí)現(xiàn)的,,這是一個獨(dú)立的庫,。 截至今天,glibc是Linux上使用最廣泛的C庫,。 然而,,在90年代期間,有一段時間里,,glibc有一個競爭對手稱為Linux libc(或者簡稱libc),它是由glibc 1.x的一個分支產(chǎn)生的,。在一段時間里,,Linux libc是許多Linux發(fā)行版中的標(biāo)準(zhǔn)C庫。
Mac和iOS版實(shí)現(xiàn)在Mac和iOS上,,C標(biāo)準(zhǔn)庫的實(shí)現(xiàn)是libSystem的一部分,,libSystem是位于/usr/lib/libSystem.dylib中的核心庫。LibSystem包含其他組件,,如數(shù)學(xué)庫,、線程庫和其他底層實(shí)用程序。 關(guān)于C++標(biāo)準(zhǔn)庫,,在OS X Mavericks(V10.9)之前的Mac上,,libstdc++是默認(rèn)選項(xiàng)。這在現(xiàn)代的基于Linux的系統(tǒng)上可以找到的同樣的實(shí)現(xiàn),。自O(shè)S X Mavericks開始,,Apple切換到使用libc++,這是LLVM項(xiàng)目——Mac官方編譯器框架——所引入的GNU libstdc++標(biāo)準(zhǔn)庫的替代,。 Windows版實(shí)現(xiàn)在Windows上,,標(biāo)準(zhǔn)庫的實(shí)現(xiàn)一直嚴(yán)格限定在Visual Studio中,,它是微軟官方的編譯器。他們通常稱之為C/C++運(yùn)行時庫(CRT),,并且它涵蓋了c/c++二者的實(shí)現(xiàn),。
Visual Studio 2015引入了深度的CRT重構(gòu),。C/C ++標(biāo)準(zhǔn)庫的實(shí)現(xiàn)遷移到一個新庫,Universal C運(yùn)行時庫 (Universal CRT或UCRT),,編譯為UCRTBASE.DLL,。 UCRT目前已經(jīng)成為Windows組之一,從Windows 10開始作為操作系統(tǒng)的一部分提供,。 Android版實(shí)現(xiàn)Bionic是Google為其Android操作系統(tǒng)所編寫的C標(biāo)準(zhǔn)庫實(shí)現(xiàn),,它直接在底層使用。 第三方開發(fā)者可以通過Android原生開發(fā)工具包(NDK)訪問Bionic,,該工具集允許你使用C和C++代碼編寫Android應(yīng)用程序,。
在 C++ 端, NDK提供了很多版本的實(shí)現(xiàn):
我能使用不同版本的實(shí)現(xiàn)代碼來替代默認(rèn)實(shí)現(xiàn)嗎?如果你正在使用資源非常有限的系統(tǒng),,則通常需要引用C標(biāo)準(zhǔn)庫的不同實(shí)現(xiàn),。比如,uClibc-ng, musl libc和diet libc等等,,所有這些都適用于嵌入式Linux系統(tǒng)的開發(fā),,提供更小的二進(jìn)制文件和更少的內(nèi)存占用。
如果我們脫離了標(biāo)準(zhǔn)庫怎么辦,? 不使用標(biāo)準(zhǔn)庫很簡單:只要在你的程序中不引入它們的任何一個頭文件,,你的工作就完成了。然而,為了讓這個操作更有意義一些,,你需要通過一些提供的系統(tǒng)調(diào)用使用某種方法與操作系統(tǒng)互動,。就像我之前說的,這就是標(biāo)準(zhǔn)庫中的函數(shù)/方法在底層實(shí)現(xiàn)的時候所使用的,。很可能你也會不得不調(diào)用這些方法來與硬件設(shè)備交互,。
https://www.oschina.net/translate/c-c-standard-library?lang=chs&page=1# |
|