【C++程序设计】头文件string与string.h的区别

781 阅读2分钟

<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字符串处理函数,比如strcmpstrlen

这个头文件跟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>文件实际上只是在一个命名空间stdinclude<string.h>