我应该将CComBSTR比较为NULL

问题描述 投票:-1回答:2

在以下代码段中,

CComBSTR bstrVal;
HRESULT hr = GetVal(bstrForest);
if (bstrVal!= NULL || bstrVal.Length() > 0)
{
    …

}

检查bstrVal!= NULL是一个有效的检查,因为bstrVal是一个类的对象?我可以在Visual Studio中看到bstrVal的值如果未初始化则变为NULL

请解释。

c++ visual-studio com
2个回答
2
投票

请注意,CComBSTR有一个重载的operator!=函数,其中包含一个整数。在C ++中,NULL是一个扩展为整数值0的宏。

这意味着你并没有真正比较bstrVal对象和NULL(它永远不会),而是调用operator!=重载,传递零,这是明确允许的。

这意味着比较很好。


1
投票

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。

在您的示例中,如果分配了if,则输入BSTR,即使其中包含0个字符。你可能想用&&而不是||

if (bstrVal != NULL && bstrVal.Length() > 0)
© www.soinside.com 2019 - 2024. All rights reserved.