windows 下的C標準庫, C執行庫(CRT ,run-time), windows API 解釋. 以及linux C擴充套件

saucej發表於2014-10-31

C執行庫和C標準庫的關係

    C標準庫,顧名思義既然是標準,就是由標準組織制定的。是由“美國國家標準協會(American National Standards Institute,ANSI)”為了規範C語言庫而制定的標準。在最初,各個大學各個公司使用的C語言庫都不盡相同,造成相互移植非常困難,在這個背景下,制定了這個標準。

    C執行庫,是和平臺相關的,即和作業系統相關的。它由不同作業系統不同開發平臺提供不同的C執行庫。但是C執行庫的部分實現是基於C標準庫的,即C執行庫是各個作業系統各個開發工具根據自身平臺開發的庫,某種程度上,可以說C執行庫是C標準庫的一個擴充套件庫,只是加了很多C標準庫所沒有的與平臺相關的或者不相關的庫介面函式。舉例子如:c標準庫的strcpy函式負責字串的拷貝,但是由於缺少對目地字串緩衝區大小的控制,極有可能導致緩衝區溢位(大量的緩衝區溢位攻擊都是由於這種漏洞而產生的);相反,Windows提供了能夠實現同樣功能的安全的字串拷貝函式,減少了緩衝區攻擊的可能,strcpy_s。這些函式是以c執行庫的方式提供的,當然,不同的作業系統,c執行時庫可能不同,但是對c標準庫的支援是完全一致的,也就是說,在不同的作業系統上,使用同一個c標準庫的函式必然產生一致的結果。

  C標準庫函式也稱為ANSI C庫函式, 在linux 下是用libc表示。  glibc是linux下的GUN C庫函式庫。(也就是libc的一個擴充套件)。glibc是由linux下面C標準庫的實現,即GNU Clibrary. glibc本身是GUN旗下的c標準庫, 後來逐漸成為linux的標準庫,而linux下原來的C標準庫linux libc逐漸不再被維護。linux下的標準庫C不僅有這個如uclibc ,klibc .

但是glibc是被用得最多的

---------------linux 的擴充套件 glibc 與 glib與libc--------------------

錯誤觀點:glib前面有一個g認為是gnu的東西,同時認為glibc 是glib的一個子集。

其實glib通用性更強。 glib和glibc沒有太大關係,可能唯一的共同點是其都是c程式設計需要呼叫的庫而已。

glib 是 Gtk+ 庫和 Gnome 的基礎。glib 可以在多個平臺下使用,比如 Linux、Unix、Windows 等。glib 為許多標準的、常用的 C 語言結構提供了相應的替代物。

glib是GTK+的基礎庫,它由基礎型別、對核心應用的支援、實用功能、資料型別和物件系統五個部分組成,可以在[http://www.gtk.org gtk網站]下載其原始碼。是一個綜合用途的實用的輕量級的C程式庫,它提供C語言的常用的資料結構的定義、相關的處理函式,有趣而實用的巨集,可移植的封裝和一些執行時機能,如事件迴圈、執行緒、動態呼叫、物件系統等的API。GTK+是可移植的,當然glib也是可移植的,你可以在linux下,也可以在windows下使用它。使用gLib2.0(glib的2.0版本)編寫的應用程式,在編譯時應該在編譯命令中加入pkg-config --cflags --libs glib-2.0,如:

gcc pkg-config --cflags --libs glib-2.0 hello.c -o hello

使用glib最有名的就是GNOME了。

【其他說法】

libc 實際上是一個泛指。凡是符合實現了 C 標準規定的內容,都是一種 libc 。
glibc 是 GNU 組織對 libc 的一種實現。它是 unix/linux 的根基之一。
微軟也有自己的 libc 實現,叫 msvcrt 。
嵌入式行業裡還常用 uClibc ,是一個迷你版的 libc 。

【總結】

libc, glibc在一個層次,都是C的標準實現庫,是作業系統級別的基石之一。

glib是用C寫的一些utilities,即C的工具庫,和libc/glibc沒有關係。

---------------------------

 C標準庫中提供的有:

  
  1. <ctype.h>:包含用來測試某個特徵字元的函式的函式原型,以及用來轉換大小寫字母的函式原型;
  2. <errno.h>:定義用來報告錯誤條件的巨集;
  3. <float.h>:包含系統的浮點數大小限制;
  4. <math.h>:包含數學庫函式的函式原型;
  5. <stddef.h>:包含執行某些計算 C 所用的常見的函式定義;
  6. <stdio.h>:包含標準輸入輸出庫函式的函式原型,以及他們所用的資訊;
  7. <stdlib.h>:包含數字轉換到文字,以及文字轉換到數字的函式原型,還有記憶體分配、隨機數字以及其他實用函式的函式原型;
  8. <string.h>:包含字串處理函式的函式原型;
  9. <time.h>:包含時間和日期操作的函式原型和型別;
  10. <stdarg.h>:包含函式原型和巨集,用於處理未知數值和型別的函式的引數列表;
  11. <signal.h>:包含函式原型和巨集,用於處理程式執行期間可能出現的各種條件;
  12. <setjmp.h>:包含可以繞過一般函式呼叫並返回序列的函式的原型,即非區域性跳轉;
  13. <locale.h>:包含函式原型和其他資訊,使程式可以針對所執行的地區進行修改。
  14. 地區的表示方法可以使計算機系統處理不同的資料表達約定,如全世界的日期、時間、美元數和大數字;
  15. <assert.h>:包含巨集和資訊,用於進行診斷,幫助程式除錯。

上述庫函式在其各種支援 C 語言的 IDE 中都是有的。

接下來繼續說windows:

   你寫的程式可以沒有math庫,程式照樣執行,只是不能處理複雜的數學運算,不過如果沒有了C   run-time庫,main()就不會被呼叫,exit()也不能被響應。因為C   run-time   library包含了C程式執行的最基本和最常用的函式。 

如下是C執行庫與C標準庫的關係:

一個C執行庫大致包含了如下功能:

l           啟動與退出:包括入口函式及入口函式所依賴的其他函式等。

l           標準函式:由C語言標準規定的C語言標準庫所擁有的函式實現。(C標準庫

l           I/O:I/O功能的封裝和實現,參見上一節中I/O初始化部分。

l           堆:堆的封裝和實現,參見上一節中堆初始化部分。

l           語言實現:語言中一些特殊功能的實現。

l           除錯:實現除錯功能的程式碼。

CRT的實現是基於Windows API的, 而windows  API的開發是基於C語言(標準庫)的,當然還有特有功能的彙編函式。  CRT在windows的表現方式是 msvcrt。

當然並不代表CRT封裝了所有的作業系統API ,如一些使用者許可權控制,作業系統執行緒建立都不屬於CRT(msvcrt) ,這些操作的實現就不得不直接

呼叫作業系統API。

 

 

 

相關文章