短い話は、私はこの動作が欲しいということです:
#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
私にはずさんなようです。
とにかく、助けてくれてありがとう!