Утверждения
Обновлен: Ноябрь 2007
Этот раздел применим к:
Выпуск |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Экспресс-выпуск |
![]() |
![]() |
Только машинный код |
![]() |
Standard |
![]() |
![]() |
Только машинный код |
![]() |
Pro и Team |
![]() |
![]() |
Только машинный код |
![]() |
Обозначения:
![]() |
Применяется |
![]() |
Неприменимо |
![]() |
Команда или команды скрытый по умолчанию. |
Оператор утверждения задает условия, которые должны выполняться на определенных этапах работы программы. Если эти условия не выполняются, утверждение признается ложным, выполнение программы прерывается и появляется диалоговое окно "Сбой утверждения".
Язык Visual C++ поддерживает операторы утверждений на основе следующих конструкций:
Утверждения MFC для программы MFC.
ATLASSERT для программ, использующих ATL.
Утверждения CRT для программ, использующих библиотеку времени выполнения C.
Функция assert ANSI для других программ C/C++.
Утверждения можно использовать в следующих целях:
Отслеживание логических ошибок. Дополнительные сведения см. в разделе Отслеживание логических ошибок.
Проверка результатов операции. Дополнительные сведения см. в разделе Проверка результатов.
Выявление условий ошибок, которые необходимо обработать. Дополнительные сведения см. в разделе Выявление причин ошибок.
Утверждения MFC и библиотеки времени выполнения C
Когда отладчик останавливается из-за утверждения MFC или библиотеки времени выполнения C, он перемещается к той точке в исходном файле, где сработало утверждение (если исходник доступен). В окне "Вывод" наряду с сообщением утверждения появляется и диалоговое окно Сбой утверждения. Это сообщение можно скопировать из окна Вывод в текстовое окно, если нужно сохранить его для дальнейшего использования. В окне Вывод могут содержаться и другие сообщения об ошибках. Следует тщательно проверять эти сообщения, потому что они могут объяснить причину сбоя утверждения.
Если правильно использовать утверждения в коде, можно перехватить много ошибок еще на этапе разработки. Рекомендуется написать утверждение для каждого сделанного предположения. Если предполагается, что аргумент не равен NULL, используйте оператор утверждения для проверки этого предположения.
_DEBUG
Операторы утверждений компилируются, только если определен _DEBUG. Если _DEBUG не определен, компилятор обрабатывает утверждения как пустые операторы. Таком образом, операторы утверждений в окончательном выпуске не приводят к дополнительным затратам; их свободно можно использовать в коде, не опасаясь снижения производительности окончательной версии программы. Также при использовании утверждений отпадает необходимость в директивах #ifdef.
Побочные эффекты использования утверждений
При добавлении утверждения в код следует убедиться, что это не вызовет побочных эффектов. Рассмотрим следующий пример:
ASSERT(nM++ > 0); // Don't do this!
Поскольку выражение ASSERT не оценивается в окончательном выпуске программы, nM будет иметь различные значения в отладочной версии и в окончательной версии. В MFC макрос VERIFY можно использовать вместо ASSERT. VERIFY оценивает выражение, но не проверяет результат в версии выпуска.
Следует быть особенно осторожным при вызовах функций в операторах утверждений, так как оценка функции может вызвать неожиданные побочные эффекты.
ASSERT ( myFnctn(0)==1 ) // unsafe if myFnctn has side effects
VERIFY ( myFnctn(0)==1 ) // safe
Макрос VERIFY вызывает myFnctn как в отладочной, так и в окончательной версии, поэтому им можно свободно пользоваться. Однако в версии выпуска дополнительные затраты все же могут возникать в связи с вызовом ненужных функций.
См. также
Основные понятия
Ссылки
Утверждения в управляемом коде