Не подавляйте предупреждения, инициализируя переменные.Предупреждения говорят вам, что код плохой.Исправьте код.
Некоторые полезные приемы:
- Объявление переменных, максимально приближенных к первому использованию.
- Перевод кодов ошибок и
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); }
};