0

短い話は、私はこの動作が欲しいということです:

#if defined(DEBUG) || defined(_DEBUG)
#define CHECK_HRESULT(x)                                    \
{                                                           \
    HRESULT hr = (x);                                       \
    if (FAILED(hr))                                         \
    {                                                       \
        DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true);  \
    }                                                       \
}
#else
#define CHECK_HRESULT(x)    (x)
#endif

しかし、フリー ビルドのエラー チェック用に HRESULT 値を保存して返したいとも考えています。基本的に、次のようなことができるようになりたいです。

HRESULT hr = CHECK_HRESULT(Some_Function_Call());

これにより、フリー ビルドとチェック ビルドの両方で hr に値が割り当てられますが、チェック ビルドで無効な HRESULT が返された場合にもダイアログ ボックスが表示されます。はい、インライン関数を作成できることはわかっていますがL#x、コード内でステートメントを 2 回コピーすることを意味する文字列を渡す必要があります。これは避けたいことです (また、試したときに同じ問題が発生します入力として受け取るだけのマクロを作成しhrます)。また、次のようなことも避けたいと思います。

#if defined(DEBUG) || defined(_DEBUG)
#define CHECK_HRESULT(x)    (x);                            \
{                                                           \
    HRESULT hr = (x);                                       \
    if (FAILED(hr))                                         \
    {                                                       \
        DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true);  \
    }                                                       \
}
#else
#define CHECK_HRESULT(x)    (x)
#endif

メモリを割り当てたり、x重要なことを実行したりする関数が非常に簡単に作成される可能性があるため、その関数を 2 回呼び出すと、特にチェック ビルドとフリー ビルドの間で、望ましくない重大な動作が発生する可能性があります。また、hr という名前の HRESULT が既に存在するという仮定を避けたいことは言うまでもありません... 私は以前にその暗い道をたどりました。いずれにせよプログラムがクラッシュする可能性が最も高いため、チェックされたビルドでデフォルトでの値を割り当てるのがおそらく安全であることは認識していますが、それはS_OK私にはずさんなようです。

とにかく、助けてくれてありがとう!

4

2 に答える 2

3

ヘルパー関数を導入できます。

#if defined(DEBUG) || defined(_DEBUG)
inline static HRESULT _Do_CheckHResult(HRESULT hr, const wchar* text, const wchar* file, DWORD line)
{
    if (FAILED(hr))                                         
    {                                                       
        DXTrace(file, line, hr, text, true);  
    }   
    return hr;
}

#define CHECK_HRESULT(x) _Do_CheckHResult(x, L#x, __FILE__, (DWORD)__LINE__)
#else
#define CHECK_HRESULT(x)    (x)
#endif

(私は頭のてっぺんから書きました。おそらくコピー貼り付けで機能するはずですが、テストしませんでした)。

于 2012-12-18T18:02:49.443 に答える
0

gcc には式で完全なコード ブロックを許可する拡張機能がありますが、VC++ にはこれが必要だと思いますか? その場合、チェックを行い、結果を v に代入するマクロ「CHECK_ASSIGN_HRESULT(v,x)」を定義できますか?

于 2012-12-18T18:04:29.123 に答える