關鍵詞:< iostream > 和 < iostream.h >

關鍵詞:< iostream > 和 < iostream.h > html

 
你寫程序的時候,用< iostream >仍是< iostream.h >?
你知道它們有什麼區別麼?仍是認爲他們根本就是同樣的?
下面聽我給你吹(文中純屬我的言論,不涉及國家機密,請放心閱讀,若轉載請註明出處做者^-^)
                              ---majianan
 
 
其實沒有< iostream.h >這樣的東西 --- 標準化委員會在簡化非C標準頭文件時用< iostream > 取代了它。但又沒有徹底取消< iostream.h >的使用,而且不少編譯器都同時支持< iostream >和< iostream.h >,形成如今的局面,老大(標準化委員會)確實有不得已的苦衷。
 
話說當年,在標準化委員會動手重建新的標準庫的時候,遇到了問題。爲了不類名函數名的衝突問題,引入了名字空間std,但無數現有的C++代碼都依賴於使用了多年的僞標準庫中的功能,例如,聲明在< iostream.h >和< complex.h >等頭文件中的功能。現有軟件沒有針對使用名字空間而進行相應的設計或者升級,若是用std來包裝標準庫致使現有代碼不能使用,那手底下的小弟(程序員)是不會贊成的。
 
標準化委員會爲了拉攏人心,吸引更多的人入會,決定爲包裝了std的那部分標準庫構建新的頭文件名。將現有C++頭文件名中的.h去掉,因此就出現了< iostream.h>和< iostream >等不少雙胞胎。對於C頭文件,採用一樣方法但在每一個名字前還要添加一個C,因此C的<string.h>變成了<cstring>。
 
舊的C++頭文件是官方明確反對使用的,但舊的C頭文件則沒有(以保持對C的兼容性)。其實編譯器製造商不會中止對客戶現有軟件提供支持,因此在能夠預計的未來,舊的C++頭文件還會囂張一段時間。
 
若是能明白字符串頭文件的使用,觸類旁通,其餘的也差很少會用了。
 
<string.h>是舊的C頭文件,對應的是基於char*的字符串處理函數;
<string>是包裝了std的C++頭文件,對應的是新的strng類;
<cstring>是對應舊的C頭文件的std版本。
 
好像跑遠了,言歸正傳。若是你的編譯器都同時支持< iostream >和< iostream.h >,那使用#include < iostream >,獲得的是置於名字空間std下的iostream庫的元素;若是使用#include < iostream.h >,獲得的是置於全局空間的一樣的元素。在全局空間獲取元素會致使名字衝突,而設計名字空間的初衷正是用來避免這種名字衝突的發生。還有,打字時< iostream >比< iostream.h >少兩個字,因此我會使用< iostream > ^-^
 
 ********************************************************************
另外的一篇文章:講解iostream和iostream.h的區別

C++中新定義的方法都是有名字空間的 好比cout就屬於std名字空間 若是include頭文件的時候加上.h,默認會using namespace 不然須要本身加上 using namespace XXX 對於C中已經定義的方法如printf,沒有影響的

iostream.h是包含輸入/輸出流處理的頭文件,iostream就什麼都不是了
但用iostream要加名詞空間namespace

#include<iostream.h>
或者是
#include<iostream>
using namespace std;
兩者都行

#include<iostream.h>是C語言中比較通用的
#include<iostream>
using namespace std;
是C++中比較通用的

#include <iostream.h>這樣寫,裏面的函數都是全局函數.

不加.h的是如今C++中規定的標準,目的在於使C++代碼用於移植和混合嵌入時不受擴展名.h的限制,避免由於.h而形成的額外的處理和修改
而加.h的是c語言的用法,可是在c++中也支持這種用法,主要是爲了向下兼容c 的內容,咱們平時儘可能不用這種方法
iostream是如今C++中規定的標準,目的在於使C++代碼用於移植和混合嵌入時不受擴展名.h的限制,避免由於.h而形成的額外的處理和修改。iostream包含的基本功能和對應的舊頭文件相同,但頭文件的內容在名字空間std中。(在標準化的過程當中,庫中有些部分的細節被修改了,因此舊頭文件和新頭文件中的實體不必定徹底對應。) 通常狀況下應該用這個頭文件,而iostream.h則是老式的,之後有可能被淘汰。
     ios

      常常在CSDN以及其餘之類的技術論壇上問關於C++ 頭文件的問題。提出這些問題的每每就是那些剛學C++的新手。當初我是菜鳥的時候也問過相似的問題。c++

 

     如今來看看下面兩個include:程序員

 

     #include<iostream>      // 這個就是1998年標準化之後的標準頭文件函數

 

     #include<iostream.h>        // 這個就是標準化之前的頭文件工具

 

 

 

     更本質上的區別就是iostream把標準C++庫的組件放在一個名位std的namespace裏面。而相對的iostream.h則將這些標準組件放在全局空間裏,同時在標準化之後舊有的C標準庫也已經通過改造了。 使用前者,就須要在代碼中添加語句:using namespace std;開發工具

 

     看看下面這兩個頭文件spa

 

     // 標準化後通過改造的C的標準庫,全部的組件都放在了std中設計

 

     #include<cstdio>           htm

 

     // 標準化之前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++標準程序庫》。

相關文章
相關標籤/搜索