C標準函式庫

C 標準函式庫C standard library,縮寫:libc)是在C語言程式設計中,所有符合標準的標頭檔header file)的集合,以及常用的函式庫實作程式(如 I/O 輸入輸出字串控制)。不像 COBOLFortranPL/I程式語言,在 C 語言的工作任務裏不會包含嵌入的關鍵字,所以幾乎所有的 C 語言程式都是由標準函式庫的函數來建立的。

設計

每一個函數的名稱與特性會被寫成一個電腦檔案,這個檔案就稱為標頭檔案,但是實際的函數實作是被分存到函式庫檔案裏。標頭檔的命名和領域是很常見的,但是函式庫的組織架構也會因為不同的編譯器而有所不同。標準函式庫通常會隨附在編譯器上。因為 C 編譯器常會提供一些額外的非 ANSI C 函數功能,所以某個隨附在特定編譯器上的標準函式庫,對其他不同的編譯器來說,是不相容的。

設計質素

大多數 C 標準函式庫設計得很好。有些少部分會為了商業優勢和利益,把某些舊函數視同錯誤或提出警告。字串輸入函數 gets()scanf() 讀取字串輸入的使用是很多緩衝區溢位的原因,大多數的程式設計指南會建議避免使用。另一個較為奇特的函數是 strtok(),它原本是作為早期的詞法分析用途,但是它非常容易出錯(fragile),而且很難使用。

歷史沿革

ANSI C共包括15個標頭檔。1995年,Normative Addendum 1NA1)批准了3個標頭檔(iso646.hwchar.hwctype.h)增加到C標準函式庫中。C99標準增加了6個標頭檔(complex.hfenv.hinttypes.hstdbool.hstdint.htgmath.h)。C11標準中又新增了5個標頭檔(stdalign.hstdatomic.hstdnoreturn.hthreads.huchar.h)。至此,C標準函式庫共有29個標頭檔:

名字 源自 描述
<assert.h> 包含斷言,被用來在程式的除錯版本中幫助檢測邏輯錯誤以及其他類型的bug。
<complex.h> C99 一組操作複數的函數。
<ctype.h> 定義了一組函數,用來根據類型來給字元分類,或者進行大小寫轉換,而不關心所使用的字元集(通常是ASCII或其擴充字元集,也有EBCDIC)。
<errno.h> 用來測試由庫函數報的錯誤代碼。
<fenv.h> C99 定義了一組用來控制浮點數環境的函數。
<float.h> 定義了用於浮點數庫特定實現的宏常數。
<inttypes.h> C99 定義精確的寬度整數類型。
<iso646.h> NA1 定義幾個等效於C中某些運算子的宏。用於使用ISO 646變體字元集進行編程。
<limits.h> 定義了用於整數庫特定實現屬性的宏常數。
<locale.h> 定義C語言本地化函數。
<math.h> 定義C語言數學函數。
<setjmp.h> 定義了巨集setjmplongjmp,在非局部跳轉的時候使用。
<signal.h> 定義C語言訊號處理常式。
<stdalign.h> C11 用於查詢和指定對象的數據結構對齊方式。
<stdarg.h> 用於查詢和指定對象的數據結構對齊方式。
<stdatomic.h> C11 用於查詢和指定對象的數據結構對齊方式。
<stdbool.h> C99 定義布林資料類型。
<stddef.h> 定義了幾個常見的類型與巨集
<stdint.h> C99 定義精確的寬度整數類型。
<stdio.h> 定義輸入輸出函數。
<stdlib.h> 定義數值轉換函數,偽亂數生成函數,動態主記憶體分配函數,過程控制函數。
<stdnoreturn.h> C11 用於指定非返回函數。
<string.h> 定義C語言字串處理常式。
<tgmath.h> C99 定義類型通用數學函數。
<threads.h> C11 定義用於管理多個線程以及互斥體和條件變數的函數。
<time.h> 定義日期和時間處理函數。
<uchar.h> C11 用於操作Unicode字元的類型和函數。
<wchar.h> NA1 定義寬字串處理函數。
<wctype.h> NA1 定義一組函數,用於按類型對寬字元進行分類或在大小寫之間進行轉換。

參考文獻

外部連結

參見