1. 程式人生 > >linux Ubuntu C++:“fatal error: iostream.h: No such file or directory ”

linux Ubuntu C++:“fatal error: iostream.h: No such file or directory ”

所以,新的標準是:
#include <iostream>  //標準輸入輸出流
using namespace std;
(因為iostream宣告在std中,故而要加上這句,除非你不用庫函式,否則錯誤); 很多編譯器都同時支援這兩種標頭檔案形式,更好的當然是標準標頭檔案。至於為什麼不廢除非標準標頭檔案,大概是為了相容以前的程式碼吧。 還有一點在標準c++中,所有庫函式都沒有.h字尾了,如果是c語言的庫函式,則去掉字尾,並在開頭加上一個c(如,c++的string.h變為string,c語言的stdio.h,變為cstdio,c語言的string.h變為cstring等等)。

使用<iostream>時,引入std::有以下方法:

1.
using namespace std;
cout<<x;
2.
using std::cout;
cout<<x;
3.
最基本的std::cout<<x;

通常用#include <iostream>時,要用using namespace std;如果你不用這個,就要在使用cout時,用後兩種方法了。
其他標頭檔案也是同樣的道理。
(有“.h”的就是非標準的,C的標準庫函式,無“.h”的,就要用到命令空間,是C++的。還有一部分不完全是有“.h”和沒“.h”的差別。例如:math.h和cmath)#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則是老式的,以後有可能被淘汰。  

     現在來看看下面兩個include:

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

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

     更本質上的區別就是iostream把標準C++庫的元件放在一個名位std的namespace裡面。而相對的iostream.h則將這些標準組件放在全域性空間裡,同時在標準化以後舊有的C標準庫也已經經過改造了。 使用前者,就需要在程式碼中新增語句:using namespace std;

     看看下面這兩個標頭檔案

     #include<cstdio>        // 標準化後經過改造的C的標準庫,所有的元件都放在了std中

     #include<stdio.h>        // 標準化以前C++中的C標準庫

     // 在看看這個標頭檔案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。

還有最後一點,在linux 中,主函式應為:
int main(void) 
不然還會報錯
 
感謝:
http://blog.chinaunix.net/uid-26696487-id-3151002.html ;
http://www.blogjava.net/hijackwust/archive/2008/06/20/209529.htmlhttp://zhidao.baidu.com/link?url=F-wOvjjrYvL0ULpAMnBqSga_36PehV9IvIJE5A8cQQix3YpuiQDju6Yq47qd7VA0eMD6efw__0hpbm8ReXWqWq