我在“发布”中使用下面的代码进行断言,已经有一段时间没有问题了。然后出现了 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)
将执行作为条件传递的任何表达式,这是一个否否 - 放入ASSERT
CallMeOnce()
表达式是不可能的 - 重构所有不同
CallMeOnce()
的 s 不是一种选择 - 我宁愿不必为了避免警告而在宏之外编写类似
(void)result
,if (result == result) {}
或UNREFERENCED_PARAMETER(result)
(或等效)的脚手架代码,因为它使代码更难阅读(污染),并且在 Debug 中编写代码时很容易忘记。另外:在很多地方!
我正在考虑为变量创建另一个宏(ASSERTU?),但感觉很……古怪!
有没有人找到更好的出路?
非常感谢!
编辑:澄清了对调用者级别的变量处理的偏好