LPTSTR* arrpsz = new LPTSTR[ m_iNumColumns ];
arrpsz[ 0 ] = new TCHAR[ lstrlen( pszText ) + 1 ];
(void)lstrcpy( arrpsz[ 0 ], pszText );
这是一个关于MFC中字符串的代码片段,还有_T("HELLO")。为什么MFC中有这么多字符串类型?它们是用来做什么的?
发布于 2009-08-29 19:48:37
严格地说,您在这里显示的是特定于windows的字符串,而不是MFC字符串类型(但如果添加CString和std::String,则更好地理解了您的观点)。它比需要的更复杂--很大程度上是由于历史原因。
tchar.h绝对值得一看--也可以在MSDN上搜索TCHAR。
在C中有一个关于字符串处理的老笑话,你可能会觉得很有趣:C中的字符串处理非常有效,因为没有字符串类型。
发布于 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一样,如果可以从头开始,其中有很多东西将完全不同地完成。
发布于 2009-08-29 19:33:34
请参阅Generic-Text Mappings in TCHAR.H和Windows Data Types中对LPTSTR
的描述。
https://stackoverflow.com/questions/1352990
复制相似问题