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

时间:2009-08-30 03:17:42

标签: string mfc

LPTSTR* arrpsz = new LPTSTR[ m_iNumColumns ];
arrpsz[ 0 ] = new TCHAR[ lstrlen( pszText ) + 1 ];
(void)lstrcpy( arrpsz[ 0 ], pszText ); 

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

3 个答案:

答案 0 :(得分:2)

严格来说,你在这里展示的是特定于Windows的字符串,而不是MFC字符串类型(但如果你添加CString和std :: string,你的观点会更好。)它比它需要的更复杂 - 主要是出于历史原因。

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

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

答案 1 :(得分:2)

历史原因。

原始的Windows API在C中(除非真实的原件是在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,但它获得了一组与之前的数据类型相对应的Microsoft数据类型。此外,由于人们可能希望有时用Unicode编译,有时用ASCII编译,因此他们制作了TCHAR字符类型和相应的字符串类型,它们基于char(用于ASCII编译)或wchar_t (对于Unicode)。

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

与任何成熟且使用频繁的应用程序或API一样,如果可以从头开始完成,那么其中有很多内容会完全不同。

答案 2 :(得分:0)

请参阅Generic-Text Mappings in TCHAR.H中的Windows Data TypesLPTSTR的说明。