正确的初始化HRESULT的方法是什么?

3

我正在使用Visual Studio 2005中的C++,出现了许多警告,内容如下:

potentially uninitialized local variable 'hr' used

hr被定义为

HRESULT hr;

如何正确地初始化 HRESULT?


不要忽略这个警告,你的代码有问题。指的是你片段中没有的那部分代码。 - Hans Passant
4个回答

6

选择一个错误的 HRESULT 值并使用它,所以 HRESULT hr = E_UNEXPECTEDHRESULT hr = E_FAIL 将是不错的选择。


我想我更乐观 :-) 但我喜欢这种方法。+1 - Ferruccio
这通常比S_OK更稳健。原因是大多数函数存在更多的失败模式而不是成功模式,因此存在更多的失败返回路径。然而,该函数被编写成成功执行,并且对该返回路径进行了最大限度的关注。因此,在成功返回路径上忘记'hr = S_OK;'语句非常罕见,但在失败情况下遗漏'hr = E_FAIL'则经常发生。 - MSalters
我总是认为假设失败更安全...而且 "E_UNEXPECTED" 的文本实在是太好了 ;) - Len Holgate

2
我会使用:

HRESULT hr = NOERROR;

您也可以使用
HRESULT hr = S_OK;

两者都将其设置为0。


2

根据你想要的聊天效果而定:

  • 默认失败?使用 E_FAIL
  • 默认成功?使用 S_OK
  • 如果后续代码无法初始化,则 hr 值不相关?使用 E_UNEXPECTED

1

不要通过初始化变量来抑制警告。这些警告告诉你代码有问题。修复代码。

一些有用的技巧:

  • 尽可能靠近第一次使用时声明变量。
  • 将错误代码和 HRESULT 转换为 C++ 异常。
  • 包装您重复使用且设计特别糟糕的 API 函数。

HRESULT 转换为异常可以通过使用 ">> throwing pattern" 非常简洁地完成,几乎可读性强,例如(虽然此示例不涉及 HRESULT,但它显示该模式概括了大多数 C 风格方案)...

std::ostream& operator<<( std::ostream& stream, wchar_t const s[] )
{
    Size const  nBytes      = wcstombs( 0, s, 0 );
    (nBytes >= 0)
        || throwX( "wcstombs failed to deduce buffer size" );

    Size const              bufSize     = nBytes + 1;
    std::vector< char >     buf( bufSize );

    // The count of bytes written does not include terminating nullbyte.
    wcstombs( &buf[0], s, bufSize )
        >> Accept< IsNonNegative >()
        || throwX( "wcstombs failed to convert string" );

    return (stream << &buf[0]);
}

所需的支持定义并不复杂,例如:

inline bool throwX( std::string const& s )
{
    throw Failure( s );
}

template< class Predicate >
struct Accept: Predicate
{};

template< class Type, class Predicate >
inline bool operator>>( Type const& v, Accept< Predicate > const& isOK )
{
    return isOK( v );
}

struct IsNonNegative
{
    template< class Type >
    bool operator()( Type const& v ) const { return (v >= 0); }
};

5
啊,又一个>>重载?这真的是世界需要的吗?;) - jalf
@jalf:我不知道还有其他的>>重载(除了iostreams中的)。 - Cheers and hth. - Alf
@Alf:是的,我指的就是那个。那个已经相当有争议了。 :) - jalf
1
如果我们恰好在使用C语言,在那里这一切都是不可能的怎么办? - Len Holgate
@匿名的踩贴者:请解释一下你的踩贴原因,这样其他人就更容易忽略它了。 - Cheers and hth. - Alf
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接