天天看點

C++新手必問之頭檔案(轉)

 ​

.h,.cpp要同名!

經常在CSDN以及其他之類的技術論壇上問關于C++ 頭檔案的問題。提出這些問題的往往就是那些剛學C++的新手。當初我是菜鳥的時候也問過類似的問題。

    現在來看看下面兩個include:

    #include<iostream>     // 這個就是1998年标準化以後的标準頭檔案

    #include<iostream.h>       // 這個就是标準化以前的頭檔案

    更本質上的差別就是iostream把标準C++庫的元件放在一個名位std的namespace裡面。而相對的iostream.h則将這些标準元件放在全局空間裡,同時在标準化以後舊有的C标準庫也已經經過改造了。

    看看下面這兩個頭檔案

    // 标準化後經過改造的C的标準庫,所有的元件都放在了std中

    #include<cstdio>          

    // 标準化以前C++中的C标準庫

    #include<stdio.h>

    // 在看看這個頭檔案C标準庫下 基于char* 的字元處理函數庫

    #include<string.h>

    // 在标準化以後他變成了這樣

    #include<cstring>

    // 但是很多朋友還看見過這個字元串處理函數庫,他包含了新的string class

    #include<string>

    經過了标準委員會如此大規模手術後,在98年以前出品的C++編譯器(BC3.0,BC5.0)上能順利通過編譯的源檔案,在支援新标準的編譯器上可能無法順利通過編譯也就是很正常的事了。

[起因]

   在回過頭來看看标準程式庫,這個程式庫涵蓋範圍相當廣大,提過了許許多多好用的功能。正是因為這樣标準程式庫中class的名稱和函數名與第三方提供的程

序庫中的class名或是函數名發生名字沖突的可能性大大增大。為了避免這個問題的發生,标準委員會決定将标準程式庫中每一樣東西都放在

namespace std中。但是這麼做同時有引來了一個新的問題。很多C++程式代碼依賴那些已經存在很多年的C++

“準”标準程式庫(C++遲遲未标準化才導緻這些情況的發生),例如iosteam.h,complex.h等等。

   為了解決這個新出現的問題,标準化委員會決定設計一些新的頭檔案名,給那些穿上std外衣的元件所使用。把C++頭檔案的.h去掉,于是就有前面出現的

iostream,同樣C的頭檔案也做了相同的處理,同時在前面加上了一個字母c,以表示是C的頭檔案(感覺上有中種族歧視的感覺)。同時标準化委員會聲

明就有的C++頭檔案将不再列于被支援的名單之中了,而舊有的C頭檔案為了滿足“對C的相容性”這個古老契約,仍然将繼續存活下去。

但是,那些編譯器廠商不可能去推翻他們客戶的舊有編譯器(也跟本不會去這麼做),是以那些舊有的C++頭檔案仍然苟延殘喘的活了下來,并不斷的擾亂那些C++新兵的心智。

    下面就是現在大多數C++開發工具表示頭檔案的組織狀态:

1.    舊的C++頭檔案比如iostream.h,他們雖然被标準化委員會所抛棄,但由于各大廠商為了各自的商業利益仍然将繼續存活下去,這些頭檔案的内容将不處于namespace std中。

2.    新的C++頭檔案如iostream雖然提供了和舊有頭檔案相同的功能,但他的内容都并入了namespace std中,進而有效避免了名字污染的問題。

3.    标準C的頭檔案如stdio.h繼續獲得支援,這類檔案的内容并未放在std中。

4.    C函數庫的技能也有對應的新式C++版本,起名稱類似cstdio,這類頭檔案的内容也有幸穿上了std的外衣。

其實标準化以後的标準程式庫的改動并不隻有這些而已,很多的标準化元件都被“tamplate化”。其中就有元老級人物iostream。标準程式庫的問題并不是用一篇,兩篇

文章就可以說清楚的。如果你像進一步的了解C++的标準程式庫的話,你可以看看侯先生的《C++标準程式庫》。

[參考文獻]

    Stanley B.Lippman著 潘愛民等譯,C++ Primer,3rd Edition,中國電力出版社,2002年。

    Scott Meyers著 侯捷譯,Effective C++,2nd Edition,華中科技大學出版,2001年。

C++中的頭檔案1.1

标準庫中的頭檔案C++标準庫中的一切内容都被放在名字空間std中(名字空間中的内容對外是不可見的),但是帶來了一個新問題,無數現有的C++代碼都

依賴于使用了多年的僞标準庫中的功能,如聲明在<iostream.h>等頭檔案中的功能,使用std包裝标準

庫導緻現有代碼的不可用,為了相容這種情況,标準委員會為包裝了std的那部分标準庫建立了新的頭檔案,新的頭檔案的檔案名與舊的一樣,隻是沒有.h這個字尾,如<iostream.h>就變成了<iostream>。對于C頭檔案,采用同樣的方法,但

還在每個頭檔案名前加了字元c,如<string.h>就變成了<cstring>,<stdio.h>變成

了<cstdio>。最好使用新的檔案頭,使用新的檔案頭的C++程式,需要使用using namespace std或者using

namespace std::指定的類名,等方法來使需要的類對于我們的代碼可視。