【问题标题】:Should I Compare CComBSTR to NULL我应该将 CComBSTR 与 NULL 进行比较吗
【发布时间】:2023-03-12 18:29:01
【问题描述】:
在下面的代码sn-p中,
CComBSTR bstrVal;
HRESULT hr = GetVal(bstrForest);
if (bstrVal!= NULL || bstrVal.Length() > 0)
{
…
}
检查 bstrVal!= NULL 是否是有效检查,因为 bstrVal 是类的对象?
我可以在 Visual Studio 中看到 bstrVal 的值如果未初始化则变为 NULL。
请解释一下。
【问题讨论】:
标签:
c++
visual-studio
com
【解决方案1】:
注意CComBSTR 有一个重载的operator!= 函数,其中包括一个整数。而在 C++ 中NULL 是一个宏,它被扩展为整数值0。
这意味着您并没有真正将bstrVal object 与NULL (永远不会)进行比较,而是调用operator!= 重载,传递明确允许的零。
这意味着比较是好的。
【解决方案2】:
在您的示例中,将 CComBSTR 与 NULL 进行比较是合法的,因为 CComBSTR 覆盖 operator!= 以支持将 NULL 作为输入值(但有更好的选项可用于检查 CComBSTR 是否具有非 NULL BSTR)。
但是,如果您只对长度大于 0 的 BSTR 感兴趣,那么检查 NULL 是多余的:
CComBSTR bstrVal;
HRESULT hr = GetVal(&bstrVal);
if (bstrVal.Length() > 0)
{
…
}
CComBSTR::Length() 是SysStringLen() 的包装器,它为 NULL BSTR 返回 0。
在您的示例中,如果分配了 BSTR,则输入您的 if,即使其中包含 0 个字符。您可能打算使用&& 而不是||:
if (bstrVal != NULL && bstrVal.Length() > 0)