对字符串包装类使用printf()或其它类似功能的函数时要特别小心。包括sprintf()函数及其变种,以及TRACE 和ATLTRACE 宏。它们的参数都不做类型检验,一定要给它们传递C语言字符串,而不是整个string对象。
例如,要向ATLTRACE()传递一个_bstr_t 里的字符串,必须显式用(LPCSTR)或 (LPCWSTR)进行强制类型转换:
_bstr_t bs = L"Bob!"; ATLTRACE("The string is: %s in line %d ", (LPCSTR) bs, nLine);
如果忘了用强制类型转换,直接把整个 _bstr_t 对象传递给ATLTRACE,跟踪消息将输出无意义的东西,因为_bstr_t 变量内的所有数据都进栈了。
常用的字符串类之间的转换方法是:将源字符串转换为C类型字符串指针,然后将该指针传递给目标类的构造函数。下面列出将字符串转换为C类型指针的方法,以及哪些类的构造函数接受C类型指针。
Class |
string |
convert to char |
convert to constchar |
convert to |
convert to const |
convert to |
construct from char |
construct from |
|
|
yes, cast1 |
yes, cast |
yes, cast1 |
yes, cast |
yes2 |
yes |
yes |
|
|
no |
no |
no |
cast to |
cast to |
yes |
yes |
|
MBCS |
no |
yes, |
no |
no |
no |
yes |
no |
|
Unicode |
no |
no |
no |
yes, |
no |
no |
yes |
|
|
no |
no |
no |
yes, cast |
yes, cast |
yes |
yes |
|
|
no |
no |
no |
yes4 |
yes4 |
yes |
yes |
|
|
no6 |
in MBCS |
no6 |
in Unicode |
no5 |
yes |
yes |
|
|
no |
no |
no |
yes4 |
yes4 |
in MBCS builds |
in Unicode builds |
附注: