天天看點

#include <iostream>與#include <iostream.h>的差別

現在來看看下面兩個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 >。