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

时间:2010-10-08 10:56:13

标签: c++ visual-studio-2005

我在Visual Studio 2005中使用C ++,并且我收到了许多读取

的警告
potentially uninitialized local variable 'hr' used

其中hr定义为

HRESULT hr;

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

4 个答案:

答案 0 :(得分:4)

选择错误HRESULT并使用该值,因此HRESULT hr = E_UNEXPECTEDHRESULT hr = E_FAIL将是我期待的好选择。

答案 1 :(得分:2)

我会用:

HRESULT hr = NOERROR;

您也可以使用

HRESULT hr = S_OK;

两者都设置为0。

答案 2 :(得分:2)

取决于您想要的聊天:

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

答案 3 :(得分:1)

不要通过初始化变量来抑制警告。警告告诉您代码是坏的。修复代码。

一些有用的技巧:

  • 尽可能将变量声明为接近首次使用。
  • 将错误代码和HRESULT翻译为C ++例外。
  • 包装您重复使用且具有特别难以设计的API函数。

HRESULT转换为异常可以通过使用">> throwing pattern"非常简洁且几乎可读,就像(尽管此示例不涉及HRESULT s它表明该模式已推广处理大多数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); }
};