目錄
在前面的各章中我們已經見過C標準庫的一些用法,總結如下:
我們最常用的是包含stdio.h
,使用其中聲明的printf
函數,這個函數在libc
中實現,程序在運行時要動態連結libc
共享庫。
在第 1 節 “數學函數”中用到了math.h
中聲明的sin
和log
函數,使用這些函數需要動態連結libm
共享庫。
在第 2 節 “數組應用實例:統計隨機數”中用到了stdlib.h
中聲明的rand
函數,還提到了這個標頭檔中定義的RAND_MAX
常量,在例 8.5 “剪刀石頭布”中用到了stdlib.h
中聲明的srand
函數和time.h
中聲明的time
函數。使用這些函數需要動態連結libc
共享庫。
在第 2 節 “main
函數和啟動常式”中用到了stdlib.h
中聲明的exit
函數,使用這個函數需要動態連結libc
共享庫。
在第 6 節 “折半查找”中用到了assert.h
中定義的assert
宏,在第 4 節 “其它預處理特性”中我們看到了這個宏的一種實現,它的實現需要調用stdio.h
和stdlib.h
中聲明的函數,所以使用這個宏也需要動態連結libc
共享庫。
在第 2.4 節 “sizeof運算符與typedef類型聲明”中提到了size_t
類型在stddef.h
中定義,在第 1 節 “指針的基本概念”中提到了NULL
指針也在stddef.h
中定義。
在第 1 節 “本章的預備知識”中介紹了stdlib.h
中聲明的malloc
和free
函數以及string.h
中聲明的strcpy
和strncpy
函數,使用這些函數需要動態連結libc
共享庫。
在第 6 節 “可變參數”中介紹了stdarg.h
中定義的va_list
類型和va_arg
、va_start
、va_end
等宏定義,並給出了一種實現,這些宏定義的實現並沒有調用庫函數,所以不依賴于某個共享庫,這一點和assert
不同。
總結一下,Linux平台提供的C標準庫包括:
一組標頭檔,定義了很多類型和宏,聲明了很多庫函數。這些標頭檔放在哪些目錄下取決於不同的編譯器,在我的系統上,stdarg.h
和stddef.h
位於/usr/lib/gcc/i486-linux-gnu/4.3.2/include
目錄下,stdio.h
、stdlib.h
、time.h
、math.h
、assert.h
位於/usr/include
目錄下。C99標準定義的標頭檔有24個,本書只介紹其中最基本、最常用的幾個。
一組庫檔案,提供了庫函數的實現。大多數庫函數在libc
共享庫中,有些庫函數在另外的共享庫中,例如數學函數在libm
中。在第 4 節 “共享庫”講過,通常libc
共享庫是/lib/libc.so.6
,而我的系統啟用了hwcap機制,libc
共享庫是/lib/tls/i686/cmov/libc.so.6
。
本章介紹另外一些最基本和最常用的庫函數(包括一些不屬於C標準但在UNIX平台上很常用的函數),寫這一章是為了介紹字元串操作和檔案操作的基本概念,而不是為了寫一本C標準庫函數的參考手冊,Man Page已經是一本很好的手冊了,讀者學完這一章之後在開發時應該查閲Man Page,而不是把我這一章當參考手冊來翻,所以本章不會面面俱到介紹所有的庫函數,對於本章講到的函數有些也不會講得很細,因為我假定讀者經過上一章的學習再結合我講過的基本概念已經能看懂相關的Man Page了。很多技術書的作者給自己的書太多定位,既想寫成一本入門教程,又想寫成一本參考手冊,我覺得這樣不好,讀者過于依賴技術書就失去了看真正的手冊的能力。