转载:CC++关于string.h头⽂件和string类
学习C语⾔时,⽤字符串的函数例如stpcpy()、strcat()、strcmp()等,要包含头⽂件string.h 学习C++后,C++有字符串的标准类string,string 类也有很多⽅法,⽤string类时要⽤到string.h头⽂件。我现在看vc的书上也有CString类,这个要包含什么,怎么⽤?
我现在很迷惑,这两个 string.h有什么区别。是怎么回事
且看⼀:
这两个⼀个是标准C库的,定义了⼀些字符串的处理函数.⼀个是标准C++库的,定义了标准C++的std::string类. 要⽤这个类要包含头⽂件
<string>...如下; #include <string> using namespace std;//关于名字空间有兴趣⾃⼰查去,⼀般⽤标准库这句就⾏了
当然标准C库也是标准C++库的⼀部分,要⽤标准C库⾥的处理函数...如下: #include <string.h>//所以你⽤这句包含的是标准C库的头⽂件 ...或者⽤如下C++风格的,它们是等价的,不过⽐较推荐: #include <cstring> using namespace std;
CString类是MFC的类,...不搞Windows MFC编程⽤不到
且看⼆:
#include < string .h >
void main() {
c++string类型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名字空间的版本。
笑谈(来⾃⾼质量++)
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 类。
如果能掌握这些(我相信你能),其余的也就容易了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论