【问题标题】: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 objectNULL (永远不会)进行比较,而是调用operator!= 重载,传递明确允许的零。

这意味着比较是好的。

【讨论】:

  • 比较可能没问题,但是CComBSTR还定义了operator!operator BSTR,在比较NULL时应该使用它们来代替,例如:if ((bstrVal) && ...)
【解决方案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)

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 2022-09-30
    • 2019-10-19
    • 2011-04-23
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多