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...