在以下代码段中,
CComBSTR bstrVal;
HRESULT hr = GetVal(bstrForest);
if (bstrVal!= NULL || bstrVal.Length() > 0)
{
…
}
检查bstrVal!= NULL
是一个有效的检查,因为bstrVal
是一个类的对象?我可以在Visual Studio中看到bstrVal
的值如果未初始化则变为NULL
。
请解释。
请注意,CComBSTR
有一个重载的operator!=
函数,其中包含一个整数。在C ++中,NULL
是一个扩展为整数值0
的宏。
这意味着你并没有真正比较bstrVal
对象和NULL
(它永远不会),而是调用operator!=
重载,传递零,这是明确允许的。
这意味着比较很好。
将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)