Я использую приведенный ниже код для утверждения в «выпуске», в течение некоторого времени не испытывая никаких проблем. Затем появился Visual Studio 2010 Pro SP1, и все пошло на юг, as also happened to mr. Krunthar.Ассемблеры и неиспользуемые переменные в Visual Studio 2010 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)
будет выполнять любое выражение передается как условие, которое является не не - Ввод
CallMeOnce()
внутри выражения ASSERT невозможно - Рефакторинг все различные
CallMeOnce()
S не вариант - Я предпочел бы не писать код люльки как
(void)result
,if (result == result) {}
илиUNREFERENCED_PARAMETER(result)
(или эквивалент) вне макроса, только чтобы избежать предупреждение, так как это делает код еще труднее читать (загрязнение), и его легко забыть при написании кода в Debug. Также: во многих местах!
Я рассматриваю возможность создания другого макроса (ASSERTU?) Только для переменных, но он чувствует себя так ... изворотливый!
Кто-нибудь нашел лучший выход?
Большое спасибо!
Edit: осветленный предпочтение переменной обработки на уровне
Включите предупреждение прочь. –
И пропустите все другие действительно неиспользованные переменные, загромождающие код? :) – ptor