副标题#e#
#include < string .h >
void main()
{
string aaa = " abcsd d " ;
printf( " looking for abc from abcdecd %s\n " ,
(strcmp(aaa, " abc " )) ? " Found " : " Not Found " );
}
不能正确执行,提示说是string 范例没有界说
而下面:
#include < string >
using namespace std;
void main()
{
string aaa = " abcsd d " ;
printf( " looking for abc from abcdecd %s\n " ,
(strcmp(aaa, " abc " )) ? " Found " : " Not Found " );
}
这里的string编译器就认识了,可是strcmp就不认识了呢?
一般一个C++的老的带“。h”扩展名的库文件,好比 iostream.h,在新尺度后的尺度库中都有一个不带“。h”扩展名的 相对应,区别除了后者的许多几何改造之外,尚有一点就是后者的东东都塞进了 “std”名字空间中。
但唯独string出格。
问题在于 C++要兼容C的尺度库,而C的尺度库里可巧也已经有一个名字叫做 “string.h”的头文件,包括一些常用的C字符串处理惩罚函数,好比楼 主提到的strcmp.
这个头文件跟C++的string类半点干系也没有,所以 <string>并非<string.h>的“进级版本”,他们是毫无 干系的两个头文件。
要到达楼主的目标,好比同时:
#include < string .h >
#include < string >
using namespace std;
可能
#include < cstring >
#include < string >
个中<cstring>是与C尺度库 的<string.h>相对应,但裹有std名字空间的版本。
#p#副标题#e#
笑谈(来自高 质量++)
C++尺度库很大。很是大。难以置信的大。怎么个大法?这么说 吧:在C++尺度中,关于尺度库的规格说明占了密密麻麻300 多页,这还不包罗 尺度C 库,后者只是"作为参考"(诚恳说,原文就是用的这个词)包 含在C++库中。虽然,并非老是越大越好,但在此刻的环境下,确实越大越好, 因为大的库会包括大量的成果。尺度库中的成果越多,开拓本身的应用措施时能 借助的成果就越多。C++库并非提供了一切(很明明的是,没有提供并发和图形 用户接口的支持),但确实提供了许多。险些任何事你都可以求助于它。在归纳 尺度库中有些什么之前,需要先容一下它是如何组织的。因为尺度库中对象如此 之多,你(或象你一样的其他什么人)所选择的类名或函数名就很有大概和尺度 库中的某个名字沟通。为了制止这种环境所造成的名字斗嘴,实际上尺度库中的 一切都被放在名字空间std 中(拜见条款28)。但这带来了一个新问题。无数现 有的C++代码都依赖于利用了多年的伪尺度库中的成果,譬喻,声明在 <iostream.h>,<complex.h>,<limits.h>等头文件中的功 能。现有软件没有针对利用名字空间而举办设计,假如用std 来包装尺度库导致 现有代码不能用,将是一种可耻行为。(这种釜底抽薪的做法会让现有代码的程 序员说出比"可耻" 更逆耳的话)慑于被激愤的措施员会发生的粉碎 力,尺度委员会抉择为包装了std 的那部门尺度库构件建设新的头文件名。生成 新头文件的要领仅仅是将现有C++头文件名中的。h 去掉,要领自己不重要,正 如最后发生的功效纷歧致也并不重要一样。所以<iostream.h>酿成了 <iostream>,<complex.h>酿成了<complex>,等等。对付C 头文件,回收同样的要领,但在每个名字前还要添加一个c.所以C 的 <string.h>酿成了<cstring>,<stdio.h>酿成了 <cstdio>,等等。最后一点是,旧的C++头文件是官方所阻挡利用的(即 ,明晰列出不再支持),但旧的C 头文件则没有(以保持对C 的兼容性)。实际 上,编译器制造商不会遏制对客户现有软件提供支持,所以可以估量,旧的C++ 头文件在将来几年内照旧会被支持。
所以,实际来说,下面是C++头文件 的近况:
旧的C++头文件名如<iostream.h>将会继承被支持,尽量 它们不在官方尺度中。这些头文件的内容不在名字空间std 中。
新的C++ 头文件如<iostream>包括的根基成果和对应的旧头文件沟通,但头文件的 内容在名字空间std 中。(在尺度化的进程中,库中有些部门的细节被修改了, 所以旧头文件和新头文件中的实体不必然完全对应。)
尺度C 头文件如 <stdio.h>继承被支持。头文件的内容不在std 中。
具有C 库成果 的新C++头文件具有如<cstdio>这样的名字。它们提供的内容和相应的旧C 头文件沟通,只是内容在std 中。
所有这些初看有点怪,但不难习惯它 。最大的挑战是把字符串头文件理清楚:
<string.h>是旧的C 头 文件,对应的是基于char*的字符串处理惩罚函数;
<cstring>是对应 于旧C 头文件的std 版本;
<string>是包装了std 的C++头文件, 对应的是新的string 类。
假如能把握这些(我相信你能),其余的也就 容易了。