2008年(884)
分类: C/C++
2008-08-06 09:57:03
Rule #1 of string classes
使用cast来实现类型转换是不好的做法,除非有文档明确指出这种转换可以使用。
促使我写这两篇文章的原因是字符串类型转换中经常遇到的一些问题。当我们使用cast把字符串从类型X转换到类型Z的时候,我们不知道为什么代码不能正常工作。各种各样的字符串类型,尤其是BSTR,几乎没有在任何一个地方的文档中被明确的指出可以用cast来实现类型转换。所以我想一些人可能会使用cast来实现类型转换并希望这种转换能够正常工作。
除非源字符串是一个被明确指明支持转换操作符的字符串包装类,否则cast不对字符串做任何转换。对常量字符串使用cast不会起到任何作用,所以下面的代码:
void SomeFunc ( LPCWSTR widestr ); main() { SomeFunc ( (LPCWSTR) "C:\\foo.txt" ); // WRONG! }肯定会失败。它可以被编译,因为cast操作会撤消编译器的类型检查。但是,编译可以通过并不能说明代码是正确的。
C-style strings and typedefs
正如我在第一部分中提到的,windows APIs 是用TCHARs来定义的,在编译时,它可以根据你是否定义_MBCS或者_UNICODE被编译成MBCS或者Unicode字符。你可以参看第一部分中对TCHAR的完整描述,这里为了方便,我列出了字符的typedefs
Type | Meaning |
WCHAR | Unicode character (wchar_t) |
TCHAR | MBCS or Unicode character, depending on preprocessor settings |
LPSTR | string of char (char*) |
LPCSTR | constant string of char (const char*) |
LPWSTR | string of WCHAR (WCHAR*) |
LPCWSTR | constant string of WCHAR (const WCHAR*) |
LPTSTR | string of TCHAR (TCHAR*) |
LPCTSTR | constant string of TCHAR (const TCHAR*) |