我应该将CComBSTR比较为NULL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我应该将CComBSTR比较为NULL相关的知识,希望对你有一定的参考价值。

在以下代码段中,

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)

以上是关于我应该将CComBSTR比较为NULL的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 CComBSTR 是不是以某个前缀开头?

sprintf为null char字符串时的预期行为

是否有 CComBSTR 的缓冲版本可以使字符串连接更有效?

Spark 数据框无法比较 Null 值

CComBSTR 的内存泄漏

savedInstanceState 在片段中始终为 null