Как правильно инициализировать HRESULT? - PullRequest
2 голосов
/ 08 октября 2010

Я использую C ++ в Visual Studio 2005 и получаю много предупреждений, которые читаются как

potentially uninitialized local variable 'hr' used

Где hr определено как

HRESULT hr;

Как правильно инициализироватьHRESULT

Ответы [ 4 ]

4 голосов
/ 08 октября 2010

Выберите значение ошибки HRESULT и используйте его, поэтому я ожидаю, что HRESULT hr = E_UNEXPECTED или HRESULT hr = E_FAIL будет хорошим выбором.

2 голосов
/ 08 октября 2010

Зависит от чата, который вы хотите:

  • По умолчанию?Использовать E_FAIL
  • Успех по умолчанию?использовать S_OK
  • hr значение не имеет значения, если последующий код не сможет его инициализировать?Используйте E_UNEXPECTED
2 голосов
/ 08 октября 2010

Я бы использовал:

HRESULT hr = NOERROR;

Вы также можете использовать

HRESULT hr = S_OK;

Оба устанавливают на 0.

1 голос
/ 08 октября 2010

Не подавляйте предупреждения, инициализируя переменные.Предупреждения говорят вам, что код плохой.Исправьте код.

Некоторые полезные приемы:

  • Объявление переменных, максимально приближенных к первому использованию.
  • Перевод кодов ошибок и HRESULT s в 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); }
};
...