欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MFC CString CStringA CStringW

程序员文章站 2024-03-18 09:46:40
...

问题

我们在MFC里面经常会遇到在函数或者类型后面加字母A或者W的情况。比如标题的CStringA和CStringW.
还有比如:我就随手写了调用TextOut()函数。就有TextOutA和TextOutW.可见这种情况在MFC里面很常见。
MFC CString CStringA CStringW

解决方法

\quad为了理解清楚这个东西,需要先知道MBCS和UNICODE字符集两者的区别,以及发展历史。关于两者的区别,请看这篇文章:MFC _T。关于发展历史,就是MBCS先出现的,由于它的各种缺陷,UNICODE的出现部分是为了解决MBCS的缺点。历史的原因,导致现在的情况是,有些程序是在MBCS下运行的,有些程序是在UNICODE下运行的。虽然UNICODE可以更好的适合跨平台去移植。但是,历史嘛,就是这样,就像ipv4现在和ipv6之间的交替一样,暂时两者还要共存一段时间。
\quad扯远了,来说说A和W的区别。经过我的测试,在VC140工具集下,A对应的是MBCS,W对应的是UNICODE.对于其他的VC工具集,应该是一样的。
具体过程,请看,
当选择MBCS时。
MFC CString CStringA CStringW
拓展到的是加A的那个函数。
MFC CString CStringA CStringW

当选择Unicode时。
MFC CString CStringA CStringW
拓展到的是加W的函数。
MFC CString CStringA CStringW

同理,我标题中提到的也是这个道理。那么,问题来了,这些函数都有三种形式,那我们写代码的时候怎么办,都要自己记忆岂不是太麻烦了。其实,VS会帮我们做这一切的。我们只需要调用CString这样的什么后缀都不加的形式。VS会更具不同的字符集,自动的转换到合适的函数。

CString

最后再来说说CString,这是MFC封装的一个操作字符串的类,那么它的字符的类型是什么?

typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;

它的字符是TCHAR,TCHAR又是啥?就和前面的_T差不多,没有什么实际的意义。在实际运行的时候,会根据不同的字符集替换成wchar_t或者是char这也是来自于亲自的实验。wchar_t对应于Unicode,char对应于MBCS.

相关标签: 上班啦 C++