2010-10-08 68 views
1

我使用C++在Visual Studio 2005和我理解的阅读什么是初始化HRESULT的正确方法?

potentially uninitialized local variable 'hr' used 

凡小时被定义为

HRESULT hr; 

什么是初始化HRESULT的正确方法是很多的警告?

+0

不要忽略这个警告,你的代码是坏的。代码不在您的代码片段中。 – 2010-10-08 13:03:25

回答

2

我会用:

HRESULT hr = NOERROR; 

你也可以使用

HRESULT hr = S_OK; 

两个设置为0。

4

选择错误HRESULT价值和使用,所以HRESULT hr = E_UNEXPECTEDHRESULT hr = E_FAIL会是我期望的好选择。

+0

我想我更乐观:-)但我喜欢这种方法。 +1 – Ferruccio 2010-10-08 11:09:05

+0

这往往比S_OK更强大。原因是大多数函数的失败模式多于成功模式,因此失败返回路径更多。然而,这个功能是为了成功而写的,并且大多数人都在关注那个返回路径。因此,在成功的返回路径上忘记'hr = S_OK;'语句是非常罕见的,但在失败情况下丢失'hr = E_FAIL'往往会发生。 – MSalters 2010-10-08 11:09:55

+0

我总是觉得假设失败更安全......而'E_UNEXPECTED'的文字就是这么好;) – 2010-10-08 12:00:12

2

取决于聊天你想:

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

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

一些有用的技巧:

  • 声明变量尽可能接近实际可能第一次使用。
  • 将错误代码和HRESULT转换为C++异常。
  • 包装重复使用的API函数,这些函数具有特别糟糕的设计。

HRESULT到异常翻译可以通过使用">> throwing pattern"一样(虽然这个例子没有涉及HRESULT的IT表明,这一模式推广到处理大多数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 2010-10-08 12:21:19

+1

第一段为+1。 – 2010-10-08 13:02:37

+0

@jalf:我不知道任何其他的'''重载(除了在iostream中)。 – 2010-10-09 15:58:17

相关问题