【讀書】關於頭文件(Header File)的擴展名
《C++標準庫》(第2版)P.40-41:將C++標準庫的所有標識符都定義於namespace std內,這是標準化過程中引入的做法。這個做法不具有向後兼容性,因爲原先的C/C++頭文件都將C++標準庫的標識符定義於全局範圍(global scope)。標準化過程中有些class的接口也有了變動(當然,盡可能以向後兼容爲目標)。爲此,C++ standard特別引入一套新的頭文件命名風格,這麽一來組件供應商便得以借由“提供舊式頭文件”達到向後兼容。
既然有必要重新定義標準頭文件的名稱,正好借此機會把頭文件的擴展名做個規範。以往頭文件的擴展名五花八門,包括.h、.hpp和.hxx。相較之下如今的標準頭文件擴展名簡潔得令人喫驚:根本就沒有擴展名。於是“欲納入標準頭文件”的include語句如下:
#include <iostream> #include <string>
這種寫法也適用於C標準頭文件。但必須採用前綴字符c,不再使用擴展名.h:
#include <cstdlib> // was:<stdlib.h> #include <cstring> // was:<string.h>
在這些頭文件中,每一個標識符都被聲明於namespace std。
這種命名方式的優點之一是可以區分舊文件頭文件中的char* C函數和新頭文件中的標準C++ class string:
#include <string> // C++ class string #include <cstring> // char* function from C
注意,從操作系統的角度看,新的頭文件命名方式並非一定意味著標準頭文件沒有擴展名。針對標準頭文件而寫的include該如何處理乃是由編譯器決定。C++系統有可能自動添加一個擴展名,甚至可能使用内建聲明而根本不讀入任何文件。然而,現實中,大多數系統衹是簡單含入一個“名稱與include語句中的文件名完全相同”的文件。所以,在大部分系統中,C++標準頭文件都沒有擴展名。一般而言,爲自己所寫的頭文件加上一個適當的擴展名仍然是好主意,有助於你在文件系統中輕易識別出它們。
爲了向後兼容於C,舊式的C標準頭文件仍然有效,若有必要你還是可以使用它們,例如:
#include <stdlib.h>
此情況下標識符被聲明於全局範圍內,也聲明於namespace std中。事實上這些頭文件的行爲類似“先在std中聲明所有標識符,再明白使用using namespace把這些標識符引入全局範圍。”
至於<iostream.h>這一類C++舊式頭文件,標準書中並未加以規範,這也意味著它們不再受到支持。現實中大多數廠商會提供它們,以求向後兼容。請注意,除了引入namespace std,頭文件中還有很多改變。所以,要麽就採用頭文件舊名,要麽就應該完全改用新的標準名稱。