Содержание

День 2
Контроль допущений
Для контроля допущений предназначены четыре макроса. Это все варианты одного макроса ASSERT

Синтаксис этого макроса такой:

ASSERT(bAssumption);


Параметр передаваемый в этот макрос - любое логическое (булевое) выражение, которое всегда должно иметь значение true (истина).

ASSERT(a>=o);

Если этой функции будет в качестве аргумента передано отрицательное значение, то макрос выдаст предупреждение в виде таблички.(рис 2.2)


Ни в коем случае и никогда не помещайте в параметр, который передается макросу ASSERT, исполняемые участки кода.

При использовании ASSERT помните, что при создании серийного выпуска все макросы ASSERT удаляются из приложения. Если в параметре, передаваемом этому макросу запрограммирована логическая часть программы, то она тоже будет удалена.

Для тестирования классов и объектов в коде можно использовать две разновидности ASSERT. Первая из них ASSERT_VALID вызывается следующим образом:

ASSERT_VALID(pObject);

Эта версия макроса используется для тестирования объектов в приложении. С ее помощью контролируется правильность объектов и проверяется непротиворечивость внутреннего состояния. Параметр, передаваемый в этот макрос - это обрабатываемый объект С++.

Макрос ASSERT_VALID применим не ко всем объектам С++. Объект должен быть наследником базового класса CObject и должен иметь переопределенную функцию-член(метод) AssertValid. Для большинства стандартных классов библиотеки MFC эти критерии удовлетворяются. Когда тестируете собственные классы, необходимо помнить об этих требованиях, выдвигаемых при проектировании классов.


Вторая разновидность макроса ASSERT -это ASSERT_KINDOF,вызов которого выглядит так:

ASSERT_KINDOF(klassname,pObject);

Этот макрос определяет относится объект к определенному классу или является производным от определенного класса. Первый параметр - это имя класса, экземпляром которого должен быть второй параметр.

Эта функция может использоваться только для проверки класса, удовлетворяющего определенным критериям - например он должен быть потомком класса CObject и должен иметь один из двух других используемых в описании класса макросов. Два макроса, хотя бы один из который должен использоваться классом - это DECLARE_DINAMIC и DECLARE_SERIAL.

Так же как и макрос ASSERT оба этих варианта полностью удаляются из серийного выпуска, поэтому не используйте данные макросы в логической части программы. Вы можете применить эти макросы в вашем коде только для контроля допущений.

Еще одна разновидность ASSERT отличается от других, хотя в принципе все они похожи друг на друга. Это макрос VERIFY (проверить). Его используют так же как и макрос ASSERT.

VERIFY(bAssumption);

Единственное ключевое различие между макросами VERIFY(ПРОВЕРИТЬ)

и ASSERT(ДОБАВИТЬ УТВЕРЖДЕНИЕ)заключается в том, что любая логическая часть, переданная как параметр в макрос VERIFY ,остается и в серийном выпуске приложения. Это означает ,что вы можете помещать исполняемые участки программы в параметр макроса VERIFY ,причем эти участки не будут удалены при построении серийного выпуска. Однако как и макрос ASSERT ,макрос VERIFY может только проверять значение выражения и выдавать сообщение, если при построении отладочного выпуска выражение приняло значение false (ложь).

Слежение за потоком и выполнение программы
Существует удобная команда - TRACE. Это макрокоманда. При выполнении приложения в отладочном режиме, макрокоманда трассировки TRACE выводит в любое окно вывода отладочной информации переданное ей в качестве параметра строковое сообщение. Синтаксис его такой: TRACE("Это мое трассировочное сообщение");


Макрокоманда трассировки TRACE работает как функция printf в C. Длина выходной строки не должна превышать 512 символов.

Так же как и в случае с макросом ASSERT ,все вызовы макроса TRACE автоматически удаляются при построении серийного выпуска.

Язык С++. Форматирование строк

Существуют две разновидности функции printf. Первая fprintf, позволяет записывать строковое сообщение в файл или на выводное устройство. На самом деле функция printf содержит вызов функции fprintf, в котором указано ,на какое стандартное выводное устройство нужно послать строку. Кроме того есть функция sprintf, которая формирует строку и помещает ее в символьный массив. Иногда эти функции используются и в программах на С++.


Содержание

Hosted by uCoz