標準C語言(ANSI C)共定義了 15 個頭文件,稱為「C標準庫」,所有的編譯器都必須支持,它們包括:
早期的 C++ 還不完善,不支持命名空間,沒有自己的編譯器,而是將C++代碼翻譯成C代碼,再通過C編譯器編譯成目標代碼。
這個時候的C++仍然在使用C語言庫,此外還開發了一些新的庫,增加了不少頭文件,例如:
iostream.h:輸入輸出頭文件。
fstream.h:文件操作頭文件。
wchar.h:寬字符處理頭文件。
和C語言一樣,C++頭文件仍然以.h為後綴,其中的類、函數等都是全局範圍的。
後來C++引入了命名空間的概念,計劃重新編寫庫,將類、函數等都統一納入一個命名空間中(命名空間的名字是 std)。但是這時已經有很多用老式C++開發的程序了,它們的代碼中並沒有使用命名空間,直接修改原來的庫會帶來一個很嚴重的後果:程式設計師會因為不願花費大量時間修改老式代碼而極力反抗,拒絕使用新標準的C++代碼。
C++開發人員想了一個好辦法,保留原來的庫和頭文件,它們在C++中可以繼續使用。然後再把原來的庫複製一份,在此基礎上稍加修改,把類、函數等納入命名空間 std 下,就成了新版C++標準庫。這樣共存在了兩份功能相似的庫,使用了老式C++的程序可以繼續使用原來的庫,新開發的程序可以使用新版的C++庫。
新版C++也對頭文件的命名做了調整,去掉了後綴.h,所以老式C++的 <iostream.h> 變成了 <iostream>,<fstream.h> 變成了 <fstream>。而對於原來C語言的頭文件,也採用同樣的方法,但在每個名字前還要添加一個c字母,所以C語言的 <string.h> 變成了 <cstring>,<stdio.h> 變成了 <cstdio>。
最後一點是,舊的C++頭文件是官方所反對使用的,已明確提出不再支持,但舊的C頭文件仍然可以使用,以保持對C的兼容性。實際上,編譯器製造商不會停止對客戶現有軟體提供支持,所以可以預計,舊的C++頭文件在未來幾年內還是會被支持。
所以,實際來說,下面是C++頭文件的現狀:
1) 舊的C++頭文件,如 <iostream.h>、<fstream.h> 等將會繼續被支持,儘管它們不在官方標準中。這些頭文件的內容不在命名空間 std 中。
2) 新的C++頭文件,如 <iostream>、<fstream> 等包含的基本功能和對應的舊頭文件相似,但頭文件的內容在命名空間 std 中。
3) 標準C頭文件如 <stdio.h>、<stdlib.h> 等繼續被支持。頭文件的內容不在 std 中。
4) 具有C庫功能的新C++頭文件具有如 <cstdio>、<cstdlib> 這樣的名字。它們提供的內容和相應的舊C頭文件相同,只是內容在 std 中。
前面幾節中我們使用了C語言的格式輸出函數 printf,引入了頭文件 stdio.h,這完全沒有錯誤,因為C++兼容C。但在C++代碼中我還是推薦使用C++的頭文件,不要把C和C++代碼混合在一起使用。
如果你希望使用 printf 函數,那麼應該引入 <cstdio>,並使用命名空間 std,如下所示:
#include <cstdio>
using namespace std;
C++ 將標準庫中的所有類、函數等都放到了命名空間 std,一般在文件開頭使用 using 關鍵字聲明。
<cstdio> 和 <stdio.h> 不是一個頭文件,如果查看原始碼你會發現它們並不一樣。
一個完整的示例:
#include <cstdio>
using namespace std;
class Book{
private:
float price;
public:
void setprice(float price1){
price = price1;
}
float getprice(){
return price;
}
};
int main(){
float price;
Book book;
scanf("%f", &price);
book.setprice(price);
printf("The price of the book is %f.\n", book.getprice());
return 0;
}
運行結果:
68.5↙
The price of the book is 68.500000.