LPTSTR* arrpsz = new LPTSTR[ m_iNumColumns ];
arrpsz[ 0 ] = new TCHAR[ lstrlen( pszText ) + 1 ];
(void)lstrcpy( arrpsz[ 0 ], pszText );
这是关于MFC中的字符串的代码片段,还有_T(“HELLO”)。为什么MFC中有这么多String类型?它们用于什么?
答案 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 Types和LPTSTR
的说明。