2010-10-08 66 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

相關問題