BOOL CheckDriveFreeSpace ( LPCTSTR szDrive)
{
ULARGE_INTEGER ulgAvail;
ULARGE_INTEGER ulgNumBytes;
ULARGE INTEGER ulgFree;
if ( FALSE == GetDiskFreeSpaceEx ( szDrive ,
&ulgAvail ,
&ulgNumBytes ,
&ulgFree ))
{
ASSERT ( FALSE);
return ( FALSE);
}
}
Здесь использован обычный макрос ASSERT, но в нем не специфицировано проверяемое условие. Панель сообщения данного утверждения показывала только, что проверяемое условие имеет значение FALSE, так что от него было мало пользы. При вызове функции утверждения нужно пытаться получать (через панель сообщения) как можно больше информации относительно ее неудачного завершения.
Мой друг Дейв Анджел (Dave Angel) указал мне, что в операторе ASSERT языков С и C++ можно использовать логическую операцию NOT (!), а в качестве ее операнда — строку символов. Эта комбинация позволяет выводить более информативные сообщения, из которых, по крайней мере, можно почерпнуть какую-то идею относительно того, в чем же заключалась ошибка (без просмотра исходного кода). Следующий пример показывает надлежащий способ контроля ложного условия. К сожалению, уловка Дейва Анджела не работает в Visual Basic.
// Надлежащее использование утверждения
BOOL CheckDriveFreeSpace ( LPCTSTR szDrive)
{
ULARGE_INTEGER ulgAvail;
ULARGE_INTEGER ulgNuinBytes;
ULARGE INTEGER ulgFree;
if ( FALSE = GetDiskFreeSpaceEx ( szDrive ,
&ulgAvail ,
&ulgNumBytes,
&ulgFree ))
{
ASSERT ( !"GetDiskFreeSpaceEx failed!");
return ( FALSE);
}
}
Можно усовершенствовать прием Дейва, используя для формирования проверочного условия логическую операцию AND (&&). В следующем примере показано, как можно добавить к тексту обычного ASSERT-сообщения дополнительное уточняющее сообщение:
BOOL AddToDataTree ( PTREENODE pNode)
{
ASSERT ( ( FALSE == IsBadReadPtr
( pNode, sizeof ( TREENODE))) &&
"Invalid parameter!");