<iostream>
vs <iostream.h>
先看看C++中#include<iostream>
与#include<iostream.h>
的区别:
前者需要使用较新的编译器,而后者不需要。不过现在除了一些搞嵌入式的,大部分编译器都算是比较前卫了。
iostream
是C++的头文件,iostream.h
是C的头文件,标准的C++头文件没有.h
扩展名,将以前C的头文件转化为C++的头文件后,有时加上C的前缀表示来自于C,例如C++中的cmath
就是由C中的math.h
变来的。
再来看看命名空间:
using namespace std; //使用名字空间(使用所有)
using namespace std::cout; //只使用cout
如果不用using
,则可以在代码前使用sdt::cout
来表示std
中的cout
。
#include<iostream.h> //此处必须要加上.h
void main()
{
cout << "Right?" << endl;
}
#include<string>
#include<iostream> //此处必须去掉.h
using namespace std;
void main()
{
string s;
getline(cin, s);
cout << "Right?" << endl;
}
iostream.h
里面定义的所有类以及对象都是在全局空间里,所以你可以直接用cout
,但在iostream
里面,它所定义的东西都在命名空间std
里面,所以你必须加上using namespace std
才能使用cout
一般一个带.h
扩展名的老旧库文件,比如iostream.h
,在新标准后的标准库中都有一个不带.h
扩展名的库文件相对应,区别除了很多改进升级之外,还有一点就是新标准的库文件都把东西塞进了std
命名空间中。
<string>
vs <string.h>
唯独特别的string
头文件:
问题在于C++要兼容C的标准库,而C的标准库里碰巧也已经有一个名字叫做string.h
的头文件,包含一些常用的C字符串处理函数,比如strcmp
、strlen
。
这个头文件跟C++的string
类半点关系也没有,所以<string>
并非<string.h>
的“升级版本”,它们是毫无关系的两个头文件。
所以你可以这样用:
#include <string.h>
#include <string>
using namespace std;
或者
#include <cstring>
#include <string>
其中<cstring>
是与C标准库的<string.h>
相对应,但裹有std
命名空间的版本。
总结
最大的挑战是把字符串头文件理清楚:
<string.h>
是老旧的C头文件,对应的是基于char*
的字符串处理函数;
<string>
是包装了std
的C++头文件,对应的是新的string类
;
<cstring>
是对应于旧C头文件的std
版本。如果能掌握这些,其余的也就容易了。
再接着看:
<string>
是C++的头文件,其内包含了一个string类
,string s1
就是建立一个字符串对象;
<string.h>
的C语言的东西,并不是类,所以不能使用string s1
;
<cstring>
文件实际上只是在一个命名空间std
中include
了<string.h>
。