在C++Primer 3rd中开篇中,有这样一段程序代码:
#include <iostream>
#include <vector>
#include <string>
#define DEBUG
using namespace std;
int main()
{
#ifdef DEBUG
cout << "Beginning execution of main ()/n";
#endif
string word;
vector<string> text;
while (cin >> word)
{
#ifdef DEBUG
cout << "word read:"<< word <<"/n";
#endif
text.push_back (word);
}
}
注意到其引入头文件处:
#include <iostream>
#include <vector>
#include <string>
这里不得不提到#include<iostream.h>与#include<iostrem>区别,进而要谈论一下C库中头文件的C++名字与C名字的区别,其实在C++ Primer中已有比较详细的描述,总结起来有以下几条:
(1) iostream.h里面定义的所有类以及对象都是在全局空间里,所以你可以直接用cout ; 但在iostream里面,它所定义的东西都在名字空间std里面,所以你必须加上 using namespace std才能使用cout
(2) 但string类库属于特殊情况。问题在于C++要兼容C的标准库,而C的标准库里碰巧也已经有一个名字叫做“string.h”的头文件,包含一些常用的C字符串处理函数,如strcmp。这个头文件跟C++的string类半点关系也没有,所以<string>并非<string.h>的“升级版本”,他们是毫无关系的两个头文件。
(3) C库头文件的C++名字总是以字母C开头,后面是去掉后缀.h的名字,由于在各种C++实现中,头文件的后缀各不相同,因此标准C++头文件没有指定后缀。如输入输出流的C++头文件名字为iostream,C头文件名字为iostream.h
(4) 使用头文件的C名字,或者C++名字,两种情况下头文件的#include预处理器指示符的效果也会不同:
a.使用C++头文件的#include指示符:#include<iostream>。代码的意思是将cassert的内容读入到文本文件中。但是由于所有的C++库名字是在名字空间std中被定义的,因而在程序文本文件中,它们是不可见的,除非用下面的using指示符显式地使其可见:using namespace std;
b.使用C头文件的#include指示符:#include <iostream.h>就可直接在程序文本文件中使用名字assert(),而无需使用using指示符