如何记忆 C/C++ 中各类字符串类型之间的转换?
8 个回答
PS:这个问题我答得不太好,随便看看罢。
------
首先你要搞清楚字符串,是一个存储在连续字符数组中的字符的线性的集合。CHAR 和 WCHAR是单个字符的类型,对应了不同字符编码,前者是一个byte,后者是两个byte(编译器决定,或者可以配置,linux gcc中 wchar_t 默认 4 bytes)。前者通常是 ascii,后者通常肯定是 unicode。LPCHAR ,LPWCHAR 就是对应的这个内存的起始地址的指针,也可以说指向字符串的第一个字符,这种字符串叫做 null-terminated string。(当然它仅仅是字符指针也是可以的,如果说它是字符串,那么从这里向高地址望去,第一个值为 0 的字符标记了这个字符串的结束)。const 是暗示给编译器和代码读者的一个修饰语,但是本质上来说,在编译到指令时没有限制。报的运行时错误,是因为常量字符串所在的 segment (section)被标记成只读,不可写。TCHAR 是一个条件编译的东西,被实际映射到 CHAR 或者 WCHAR,取决于你的项目设置。LPCTSTR,也就是 const char* 或者 const wchar_t*,就是提示编译器,后面的代码不能改动这个字符串的内容。string 和 CString,分别是标准库和微软类库提供的对字符串所在内存的类封装。它们自带内存管理功能,目的,通常是为了缓解程序员对内存管理的负担。
举个简单例子,当你看到 my_strcpy (char* p1, const char* p2); 你不需要看其他任何资料,也不需要参数名称的暗示,仅根据参数类型,就能推断出 p1 是 dest,p2 是 src。
当你遇到字符串在不同系统之间交互时(例如程序读取文件,网络传输),你遇到的第一个问题,一定是要双方相互表名自己使用的编码。在 ascii , utf8 和 unicode这些常见编码中转换,你要使用 WideCharToMultiByte 等相关函数。因此,很显然,char* 和 wchar_t * 是不能直接强制类型互转的,除非你明确的知道你正在干什么。而 TCHAR* 就是这两者中的某一个,仅仅在源代码级别时存在,编译后就是实际的东西了。
此外还有 BSTR, _bstr_t,CComBSTR。确实很容易让人晕。