首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么MFC中有这么多字符串类型?

为什么MFC中有这么多字符串类型?
EN

Stack Overflow用户
提问于 2009-08-29 19:17:42
回答 3查看 407关注 0票数 2
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LPTSTR* arrpsz = new LPTSTR[ m_iNumColumns ];
arrpsz[ 0 ] = new TCHAR[ lstrlen( pszText ) + 1 ];
(void)lstrcpy( arrpsz[ 0 ], pszText ); 

这是一个关于MFC中字符串的代码片段,还有_T("HELLO")。为什么MFC中有这么多字符串类型?它们是用来做什么的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-29 19:48:37

严格地说,您在这里显示的是特定于windows的字符串,而不是MFC字符串类型(但如果添加CString和std::String,则更好地理解了您的观点)。它比需要的更复杂--很大程度上是由于历史原因。

tchar.h绝对值得一看--也可以在MSDN上搜索TCHAR。

在C中有一个关于字符串处理的老笑话,你可能会觉得很有趣:C中的字符串处理非常有效,因为没有字符串类型。

票数 2
EN

Stack Overflow用户

发布于 2009-10-12 13:50:28

历史原因。

最初的windows API是用C语言编写的(除非真正的windows API是用Pascal编写的,并且已经迷失在迷雾中了)。Microsoft创建了自己的数据类型来表示C数据类型,可能是因为C数据类型的大小不是标准的。(对于C整型,char至少8位,short至少16位且至少与char一样大,int至少16位且至少与short一样大,long至少32位且至少与int一样大)。由于Windows首先在本质上是16位的系统上运行,后来又在32位系统上运行,所以C编译器不一定在大小上达成一致。微软进一步指定了更复杂的类型,因此(如果我没记错的话)C char *将被称为LPCSTR

问题是,8位字符不适合Unicode,因为UTF-8不容易转换成C或C++。因此,他们需要一种宽字符类型,在C中称为wchar_t,但它获得了一组与早期的数据类型相对应的微软数据类型。此外,由于人们有时想用Unicode编译,有时想用ASCII码编译,所以他们将TCHAR字符类型和相应的字符串类型设置为基于char (用于ASCII编译)或wchar_t (用于Unicode)。

然后是MFC和C++ (松了一口气),微软想要一个字符串类型。因为这是在C++标准化之前,没有std::string,所以他们发明了CString。(它们的容器类也与后来成为STL的容器类不兼容,然后是库的容器部分。)

就像任何成熟的和大量使用的应用程序或API一样,如果可以从头开始,其中有很多东西将完全不同地完成。

票数 2
EN

Stack Overflow用户

发布于 2009-08-29 19:33:34

请参阅Generic-Text Mappings in TCHAR.HWindows Data Types中对LPTSTR的描述。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1352990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文