CString VS std::string

fancystyle 2010-03-09 10:07:33
很老套的问题,在网上搜了一些,还是想听听大家的意见.我是新手.

先说我不想用CString的理由:
1.我在写WTL的工程,非MFC.我在WTL的类库里面有用字符串相关的函数的情况,都是LPCTSTR 之类的.没有直接用CString.这种情况下,我用std:string与CString选择的话没有哪个会更好的理由.

2.经过比较,我已经放弃使用TCHAR类型的函数,工程使用Unicode.我感觉这样更清晰,T类型的函数让我更迷惑,要不使用char* 要不就用wchar_t*.更心安些.CString也许在处理TCHAR一类的有些方便之处.在这种情况下也没用了

3.我在使用一些网上的开源库的时候,别人的代码都是std:string.如果我使用CString.给我带来很多转换不方便.让我在写类函数接口时返回到底是是哪个.很纠结

4.看到有人说CString比string快,.NET我都用了,我不在意那点性能.

5.CString支持的方法的确比较string多.比如Format,很方便.我相信std:string肯定也有方法.我搜索即可.

我还有必要使用CString么?我想放弃之了.

学VC++给我最大的痛苦不是C++语言的复杂性.却是什么东西都让我选择,貌似选哪个都行,选哪个都不行.
...全文
1179 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
白云飘飘飘 2010-03-16
  • 打赏
  • 举报
回复
之所以会面临这种选择,只能说明C语言太伟大了,有哪种语言能像它这样适用性这么广呢?
只所以string没有提供format,是因为C++标准库的stream类专门用来处理字符串的格式化和解析的。你就用sstream好了。
Proteas 2010-03-16
  • 打赏
  • 举报
回复
既然已经用了 WTL 就用 CString 吧。
WTL 可以跨平台吗?!
没关注过。
arong1234 2010-03-16
  • 打赏
  • 举报
回复
觉得这不是那种String更好的问题,而是楼主是不是能适应、使用所有String最大利用它长处的问题。例如,楼主的例子中的_T就是一个非常有用的垫片宏,因为它让你confuse你就不用,不是说这个宏不好,而是楼主自己理解能力不足,因此驾驭不了它。

老实说,我觉得每种string都有它应用的场景,我基本上随便哪种string都用,没觉得哪种特别好那种特别不好

[Quote=引用楼主 fancystyle 的回复:]
很老套的问题,在网上搜了一些,还是想听听大家的意见.我是新手.

先说我不想用CString的理由:
1.我在写WTL的工程,非MFC.我在WTL的类库里面有用字符串相关的函数的情况,都是LPCTSTR 之类的.没有直接用CString.这种情况下,我用std:string与CString选择的话没有哪个会更好的理由.

2.经过比较,我已经放弃使用TCHAR类型的函数,工程使用Unic……
[/Quote]
zero_226 2010-03-16
  • 打赏
  • 举报
回复
哪个用的熟就用哪个,我是这么想滴
chenyu2202863 2010-03-12
  • 打赏
  • 举报
回复
都行,看你如何运用~
jackyjkchen 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fancystyle 的回复:]
多谢楼上多位大哥的指导.
引用STL与Windows系列的库混用有风险的,需要考虑到的细节太多。引用 5 楼 forestdb 的回复:要么用stl,要么用Windows的库, 不要混用。

我想知道详细点,比如什么情况下.这类风险会发生?
[/Quote]
主要是非ascii字符的处理方式、线程安全等
rome55 2010-03-12
  • 打赏
  • 举报
回复
如果你有开发3年以上的经验就用Cs
如果没有的话 就用St
xboy 2010-03-12
  • 打赏
  • 举报
回复
编程到深处可以看成是一门艺术,但是更多的情况下养成遵从标准的习惯,可以让我们少不必要的错。

boych 2010-03-12
  • 打赏
  • 举报
回复
有想法总是好的~
fancystyle 2010-03-09
  • 打赏
  • 举报
回复
多谢楼上多位大哥的指导.
引用
STL与Windows系列的库混用有风险的,需要考虑到的细节太多。
引用 5 楼 forestdb 的回复:
要么用stl,要么用Windows的库,
不要混用。


我想知道详细点,比如什么情况下.这类风险会发生?
「已注销」 2010-03-09
  • 打赏
  • 举报
回复
如果使用WTL开发,那就肯定不会考虑跨平台(也跨不了,连编译器都跨不了)。
所以,我认为CString是最好的选择。

我现在使用wxWidgets,我就会用wxString。
而当我用Qt开发时,我会用QString。

已经尽量在避免使用std::string了,因为要跨编译器。
GCC的std::string的引用计数,让我总提心吊胆。
「已注销」 2010-03-09
  • 打赏
  • 举报
回复
即使你使用std::string,在可移植性上也要小心。
因为VC7以上的std::string不使用引用计数,而GCC的std::string是使用引用计数的。
引用计数的实现有线程安全问题。
fox000002 2010-03-09
  • 打赏
  • 举报
回复
用 WTL 的话,完全可以使用 CString

ATL 中也是有 CString 的
野男孩 2010-03-09
  • 打赏
  • 举报
回复
无妨,CString和std::string两个实现都挺好的。

至于怎么选,看用途吧。要是不在意可移植性,就是在微软平台上用,CString没啥不好的。考虑到移植性的话,毫无疑问要选std::string了。
ForestDB 2010-03-09
  • 打赏
  • 举报
回复
要么用stl,要么用Windows的库,
不要混用。
jackyjkchen 2010-03-09
  • 打赏
  • 举报
回复
楼主如果真的经常使用API得话就会了解T版的作用,U+A双版本可是微软价值观的精髓所在,如果显式指定,代码不完美不说(无法调整字符集),还可能遇到许多问题。

STL与Windows系列的库混用有风险的,需要考虑到的细节太多。
  • 打赏
  • 举报
回复
喜欢用那就就用那个了,混合用也无妨.
老吴笔记 2010-03-09
  • 打赏
  • 举报
回复
如果你不打算在别的平台上用,你还是选择最方便最好的吧
如果你考虑到移植性,最好就是用标准的东西
完毕.
昵称很不好取 2010-03-09
  • 打赏
  • 举报
回复
能解决问题的方法才是好方法
想放弃也好,毕竟CString只是微软的东西,还是用标准的通用性好
字符转的各种转换函数库,用这个库,字符串的各种转换再也不头疼 //-------------字符串转数字-------------- int CString_numberStr_2_int(CString str); int stdString_2_int(std::string str);//std string 字符串转int int std_hexString_2_int(std::string str);//std string 字符串转int double CString_2_double(CString in); double stdString_2_double(std::string str);//std string 字符串转double unsigned int hexString_2_u32(std::string str); //-------------数字转字符串-------------- CString CString_int_2_numberStr(int n); CString CString_int_2_numberStr6(int n); std::string stdString_int_2_numberStr(int a); CString double_2_number_CString(double n); std::string double_2_number_String(double a); CString GetCurrWorkingDir(); //获得当前工作路径,不含最后一个字符“\” CString ascii_2_cstring(int ascii);// 把ascii字符转换成对应的字符,返回cstring类型 //-------------字符串转字符串-------------- std::string CString_2_stdString(CString str); CString stdString_2_CString(std::string str); void CString_2_charP(CString str,char *q); //cstring change to ansi string //-------------判断字符串类型-------------- bool is_a_double_type_string(CString str); //-------------字符串复杂操作-------------- int break_string(std::string instr, std::string subStr, vector<std::string>* subs); //以subStr为标记切割instr为多个单词,存储于subs std::string super_CString::getTimeString(bool fgf);//获得表示当前时间的字符串,fgf表示是否需要分隔符 std::string super_CString::getDateTimeString(bool fgf);//获得表示当前时间和日期的字符串,fgf表示是否需要分隔符 std::string getDateString(bool fgf); //获得表示当前日期的字符串,fgf表示是否需要分隔符 std::string string_trim_LR_space(std::string str);//去除字符串前后的空白字符 std::string string_trim_L_space(std::string str);//去除字符串左边的空白字符 std::string string_trim_R_space(std::string str);//去除字符串右边的空白字符 //-------------GUI相关-------------- CString get_CEdit_text(CEdit* edit); //-------------文件、路径相关-------------- CString calc_CurrWorkingDir_filename(CString str);//返回程序运行的当前路径+filename CString calc_work_full_filename(CString filename,CString path);//path为路径,如果path为空返回程序运行的当前路径+filename,否则返回path+filename。 std::string GetCurrWorkingDir_stdString(); std::string calc_CurrWorkingDir_filename(std::string str); std::string calc_work_full_filename(std::string filename,std::string path);

33,322

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧