我有以下问题考虑以下 C++ 代码片段
CComBSTR bs1=L"str1";
if (wcscmp(bs1,L"str2"))
{
....
}
问题是:在 wcscmp 函数中使用 CComBSTR 而不进行强制转换是否安全?
正如我从 MSDN 知道的那样,CComBSTR 没有显式转换运算符(而 _bstr_t 存在)提前谢谢
从技术上讲不是,一个BSTR
罐头店L"str2\0foo"
。这将wcscmp()
决定匹配,您还必须比较字符串长度以避免这种故障模式。
CComBSTR
覆盖做正确事情的 operator==() ,不妨使用它:
CComBSTR bs1=L"str1";
if (bs1 == L"str2"))
{
// etc..
}
依靠自动转换 from CComBSTR
to是安全const WCHAR*
的,唯一的例外NULL
是 的有效值BSTR
,并且NULL
参数不是wcscmp
导致运行时调用无效参数处理程序的有效参数。
只要您确定您的BSTR
原始/包装值是非 NULL 的,您就可以安全地进行转换。
正如其他人指出的那样,请注意作为终止符WCHAR*
字符串的嵌入零字符,但是由于存在显式字符串长度(在值前缀中),它可能是 BSTR 有效负载的一部分。
仅供参考,这CComBSTR
是operator ==
在内部使用VarBstrCmp
API 进行比较。
是的,除了以长度为前缀之外,BSTR 还以空结尾,并且存在从 CComBSTR 到 BSTR 的转换(通过m_str
成员)。
因此,您可以使用wcscmp(bs1, L"str2")
或wcscmp(bs1.m_str, L"str2")
,它们是等效的。
但是,BSTR 可能会嵌入空字符,请注意。如果字符串仅等于第一个空字符,则使用wcscmp(bstr1, bstr2)
可能无法满足您的要求。