С другой стороны, макросы исполнительной С-библиотеки, по умолчанию направляющие вывод утверждений на панель сообщений, позволяют переадресовывать его в файл или к API-функции outputoebugstring, вызывая функцию __CrtsetReportMode. Однако все операторы утверждений, поставляемые компанией Microsoft, имеют один фатальный недостаток: они изменяют состояние системы (неизменность состояния является кардинальным правилом, которое утверждения не могут нарушать). Вызов утверждений с побочными эффектами едва ли не хуже, чем полный отказ от использования утверждений.
Следующий пример показывает, как рассматриваемые утверждения могут изменить состояние системы при переходе от отладочной конфигурации к выпускной.
//Послать сообщение окну. Если время такой посылки истекает (тайм-аут),
// то другой поток зависает, так что нужно прервать данный поток.
//Напоминаем, что единственный способ проверить, произошел ли сбой
//функции SendMessageTimeout, состоит в том, чтобы проверить функцию
// GetLastError. Если функция возвратила 0 и последняя ошибка есть 0,
//то SendMessageTimeout выполнила тайм-аут.
_ASSERTE ( NULL != pDataPacket)
if ( NULL == pDataPacket)
return ( ERR_INVALID_DATA);
}
LRESULT IRes = SendMessageTimeout ( hUIWnd,
WM_USER_NEEDNEXTPACKET,
0
(LPARAM)pDataPacket ,
SMTO_BLOCK ,
10000
&pdwRes ) ;
_ASSERTE ( FALSE != IRes);
if ( 0 == IRes)
{
// Получить значение последней ошибки.
DWORD dwLastErr = GetLastError ();
if ( 0 == dwLastErr)
{
// UI висит или нет достаточно быстрой обработки данных.
return ( ERR_UI_IS_HUNG);
}
// Если ошибка в чем-то еще, то существует проблема
//с данными, посылаемыми через параметр.