「リリース」でアサートするために以下のコードを使用しますが、しばらくの間問題はありませんでした。その後、Visual Studio 2010 Pro SP1 が登場し、事態は悪化しました。クルンタル。
問題は、次のような健全性チェックを行うコードがある場合です。
#define ASSERT(condition, msg) do { (void)sizeof(condition); } while (0,0)
// Note: (0,0) is to avoid warning C4127: conditional expression is constant
{
int result = CallMeOnce(); // its side effects are the important stuff
// perform additional sanity checks in debug
ASSERT(result >= 0, "too low");
ASSERT(result <= 100, "too high");
ASSERT(!isPrime(result), "too prime");
}
VS2010が吐き出すwarning C4189: 'result' : local variable is initialized but not referenced
私はそれを修正する方法に途方に暮れています:
- 次のようなコード
(void)(condition)
は、条件として渡された任意の式を実行します。これは no no - ASSERT
CallMeOnce()
式の中に入れることは不可能です - すべての異なる をリファクタリングすること
CallMeOnce()
はオプションではありません (void)result
、if (result == result) {}
または(または同等の)ようなスキャフォールディング コードをマクロの外側に記述する必要はありませんUNREFERENCED_PARAMETER(result)
。警告を回避するためだけに、コードがさらに読みにくくなり (汚染)、デバッグでコードを記述しているときに忘れやすくなります。また、多くの場所で!
変数専用の別のマクロ (ASSERTU?) を作成することを検討していますが、非常に...風変わりです!
誰かがより良い方法を見つけましたか?
どうもありがとう!
編集:呼び出し元レベルでの変数処理の設定を明確化