C和C 的標準庫

2021-06-21 23:12:48 字數 3572 閱讀 1802

c/c++深層探索

本末節我們概覽一下c/c++標準庫的全貌。

c/c++標準庫的內容主要包括:

巨集定義 (譬如: #define flt_radix 2)

型別定義 (譬如: typedef unsigned wchar _t)

變數宣告和定義 (譬如: extern int errno;)

庫函式宣告和定義 (譬如: size_t strlen(const char *s);)

此中,巨集定義、型別定義、變數宣告和庫函式的宣告都在標準標頭檔案停止描述,所以,標準標頭檔案實際上已經勾畫出整個標準庫的輪廓。

ostream   queue   set   sstream

c90有這些:

assert.h   ctype.h   errno.h   float.h

limits.h   locale.h   math.h   setjmp.h

signal.h   stdarg.h   stddef.h   stdio.h

stdlib.h   string.h   time.h

map   memory   new   numeric

iso646.h   wchar.h   wctype.h

#ifdef __cplusplus

exception   fstream   functional   iomanip

stdint.h   tgmath.h

要注意的是,高版本的c標準不一定是僅僅增加了新的標頭檔案,還可能對原先低版本c標準的某些標頭檔案停止了修改和擴充。

至於c++的庫(包括巨集、型別和函式),直到c++標準出版前一直都是放在全域性空間,這些c++標頭檔案和普通的c標頭檔案一樣,均帶有「.h」字尾,例如「iostream.h」。使用上和c語言沒有什麼不同:

/*c***/

#include

int main()

extern 「c」 int yyy();      //同上

而對於c++,情況就有點複雜。

首先,c++的設計者希望c++能在相當大的程度上相容c,至少,c++編譯器應該最大限度的接受已經存在的大量c**。所以,允許使用c標準庫自然是追求的目標之一。但c語言並沒有擴充套件名字這回事,也就是說,假如想間接使用已經用c編譯器編譯好的c庫(主要是指庫函式),c++編譯器必須知道哪些是c庫函式,從而差池其停止名字擴充套件。於是,鏈結修飾符extern 「c」被用來指出哪些函式具有「c語言鏈結性質」,所以,編譯器廠商一般都會在原來的c語言標準標頭檔案增加一些東西:

#ifdef __cplusplus

extern 「c」 {

#endif

int ***(); //c標準庫函式的宣告

climits   clocale   cmath   csetjmp

//標準的c++**:

#endif

根據是否定義巨集「__cplusplus」決定是否新增「 extern 「c」 」修飾符,假如巨集被定義,則表明是c++編譯器在處理**,所以必須加上extern 「c」;否則就不用新增,因為c編譯器不認識extern 「c」。

對c標準標頭檔案作了以上處理後,我們就可以在c++**中呼叫c庫函式:

/*c++***/

#include

int main(void)

printf(「calling printf in a cpp file\n」);

doctor異鄉人 在std裡定義的c庫所對應的標頭檔案都沒有「.h」字尾,並且在前面多了乙個字元「c」,下面是c++標準規定的c庫標頭檔案(注意,這裡只有18個頭檔案,因為c99比c++標準晚推出,所以c++的c庫只包露了c95的18個頭檔案):

//早期的c++**:

#include

extern int ***();     //宣告c庫函式***()停止名字擴充套件

cout<<」using an old style head file」《自然,c++編譯器會對c++庫函式停止名字擴充套件。

不過,c++標準出來後,情形就不一樣了。標準規定,所有c/c++標準庫都必須在名字空間std裡停止定義,也就是說,標準保留出乙個特定的名字空間,專門放置c/c++標準庫,任何人都不應該在std定義自己的庫。

使用c標準庫很簡單,只需要包露相應得標頭檔案就可以了,例如:

cassert   cctype   cerrno   cfloat

c99再增加下面這些:

int main(void)

cstdlib   cstring   ctime   ciso646

#include

同樣,使用這些c++標頭檔案必須宣告使用std名字空間:

#include

using namespace std;

int yyy(); // 同上

ios   iosfwd iostream   istream

printf(「don』t say me boring please.\n」);

大概:#include

std::printf(「don』t say me boring please.\n」);

前者意味著可以間接使用已有的c庫,後者則必須用c++編譯器重新編譯c庫,g++採取了前者。

同樣,在std裡定義的c++庫對應的標頭檔案也沒有「.h」字尾,以下是全部成員:

algorithm   bitset   complex deque

complex.h   fenv.h   initypes.h   stdbool.h

iterator   limits   list   locale

c95增加這幾個:

而今我們來看看c語言的標準標頭檔案。

stack   stdexcept   streambuf   string

typeinfo   utility   valarray   vector

而今,使用「c++標準版」的c庫,必須明確宣告使用std名字空間:

#include

using namespace std;

csignal   cstdarg   cstddef   cstdio

//標準的c++**:

cout<<」yes, you』re right...i am boring.」《大概:

//標準的c++**:

cwchar   cwctype

int main(void)

std::cout<<」last time, i swear!」《最初,必定有一些喜好追問到底的讀者會問:那些在名字空間std裡面定義的c庫函式究竟有沒有停止名字擴充套件呢?

c++標準規定廠商可以自行決定是否擴充套件。就是說,c標準庫既可以這樣宣告:

namespace std

int main(void)

extern 「c」 int ***();      //宣告c庫函式***()不停止名字擴充套件

printf(「printf() again...boring!\n」);

//標準的c++**:

也可以這樣宣告:

namespace std

int main(void)

extern int yyy();     //同上

int main(void)

C 標準庫和C 標準模版庫

c 標準庫很大,在現在的情況下,c 標準庫確實越來越好,因為大的庫會包含大量的功能.標準庫中的功能越多,開發自己的應用程式時能借助的功能就越多,c 庫並非提供一切 很明顯的是沒有提供開發和圖形使用者介面的支援 但確實提供了很多.標準c 庫中主要有以下主要元件 標準c庫.i 0流技術.string.容...

關於C 和C的標準庫

c c 標頭檔案一覽 c 傳統 c include 設定插入點 include 字元處理 include 定義錯誤碼 include 浮點數處理 include 檔案輸入 輸出 include 引數化輸入 輸出 include 資料流輸入 輸出 include 定義各種資料型別最值常量 includ...

c 標準庫和stl關係

c 標準庫的所有標頭檔案都沒有副檔名。c 標準庫的內容總共在50個標準標頭檔案中定義,其中18個提供了c庫的功能。形式的標準標頭檔案 例外 其內容與iso標準c包含的name.h標頭檔案相同,但容納了c 擴充套件的功能。在 形式標準的標頭檔案中,與巨集相關的名稱在全域性作用域中定義,其他名稱在std...