現在來看看下面兩個include:
#include<iostream> // 這個就是1998年标準化以後的标準頭檔案
#include<iostream.h> // 這個就是标準化以前的頭檔案
更本質上的差別就是iostream把标準C++庫的元件放在一個名位std的namespace裡面。而相對的iostream.h則将這些标準元件放在全局空間裡,同時在标準化以後舊有的C标準庫也已經經過改造了。 使用前者,就需要在代碼中添加語句:using namespace std;
1998年标準化以後的标準頭檔案的使用方法:
方法一:
// HeadFile.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream> // 新的标準庫頭檔案使用方法
int main(int argc, char* argv[])
{
// cout,endl是定義在命名空間std裡,
// 是以必須指定命名空間
std::cout << "測試頭檔案" << std::endl;
return 0;
}
方法二:
// HeadFile.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream> // 新的标準庫頭檔案使用方法
// C++提供了更簡潔的方法來使用指令空間成員:using聲明
// 使用using聲明可以在不需要加字首std::的情況下通路命名空間中的名字
using namespace std;
int main(int argc, char* argv[])
{
// cout,endl是定義在命名空間std裡,
// 由于使用了using聲明,我們就可以直接引用名字,而不需要再引用該名字的命名空間
cout << "測試頭檔案" << endl;
return 0;
}
标準化以前的頭檔案:
// HeadFile.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream.h> // 舊的标準庫頭檔案使用方法
int main(int argc, char* argv[])
{
// cout,endl是定義在全局空間裡,
// 舊的标準庫中沒有命名空間std
cout << "測試頭檔案" << endl;
return 0;
}
這是網上摘抄的一相關解釋:
其實沒有 < 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 >。