iostream.h和iostream 區別
C++中新定義的方法都是有名字空間的 比如cout就屬於std名字空間 如果include標頭檔案的時候加上.h,預設會using namespace 否則需要自己加上 using namespaceXXX 對於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則是老式的,以後有可能被淘汰。
經常在CSDN以及其他之類的技術論壇上問關於C++ 標頭檔案的問題。提出這些問題的往往就是那些剛學C++的新手。當初我是菜鳥的時候也問過類似的問題。
現在來看看下面兩個include:
#include<iostream> // 這個就是1998年標準化以後的標準標頭檔案
#include<iostream.h> // 這個就是標準化以前的標頭檔案
更本質上的區別就是iostream把標準C++庫的元件放在一個名位std的namespace裡面。而相對的iostream.h則將這些標準元件放在全域性空間裡,同時在標準化以後舊有的C標準庫也已經經過改造了。 使用前者,就需要在程式碼中新增語句:using namespacestd;
看看下面這兩個標頭檔案
// 標準化後經過改造的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,他們雖然被標準化委員會所拋棄,但由於各大廠商為了各自的商業利益仍然將繼續存活下去,這些標頭檔案的內容將不處於namespacestd中。
2. 新的C++標頭檔案如iostream雖然提供了和舊有標頭檔案相同的功能,但他的內容都併入了namespacestd中,從而有效避免了名字汙染的問題。
3. 標準C的標頭檔案如stdio.h繼續獲得支援,這類檔案的內容並未放在std中。
4. C函式庫的技能也有對應的新式C++版本,起名稱類似cstdio,這類標頭檔案的內容也有幸穿上了std的外衣。
其實標準化以後的標準程式庫的改動並不只有這些而已,很多的標準化元件都被“tamplate化”。其中就有元老級人物iostream。標準程式庫的問題並不是用一篇,兩篇文章就可以說清楚的。如果你像進一步的瞭解C++的標準程式庫的話,你可以看看侯先生的《C++標準程式庫》。
轉載來自:百度文庫
相關文章
- 和區別
- ../和./和/的區別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- ||和??的區別
- /*和/**的區別
- Synchronize和ReentrantLock區別ReentrantLock
- SSL和TLS 區別TLS
- jquery $(this) 和this的區別jQuery
- ClassNotFoundException和NoClassDefFoundError區別ExceptionError
- substr()和substring()區別
- JQuery this和$(this)的區別jQuery
- insert和insertSelective區別
- SCSS 和 SASS 區別CSS
- T和?的區別
- localStorage和sessionStorage區別Session
- BeanFactory和FactoryBean區別Bean
- Swift和Kotlin區別SwiftKotlin
- makefile =和:=的區別
- undefined 和 null 區別?UndefinedNull
- ibtis # 和 ¥ 區別
- Python之“==”和“is”區別Python
- null和undefined區別NullUndefined
- ++a和a++的區別
- stringbuilder和stringbuffer區別UI
- SpringCloud和Dubbo區別SpringGCCloud
- sleep()和wait()區別AI
- JoinPoint和ProceedingJoinPoint區別
- 127.0.0.0和localhost區別localhost
- ./ 和sh 的區別
- get和post區別
- url和uri區別
- innerHTML 和 innerTEXT 區別HTML
- js基本型別和引用型別區別JS型別
- workman 和swoole 區別 和異同
- Cookie 和 Session 關係和區別CookieSession
- 堆和棧的概念和區別
- springmvc和springboot的區別SpringMVCSpring Boot
- SDK和API的區別?API