Система визуального объектно-ориентированного проектирования C++Builder 117

и откомпилировать файл, как вызов функций, в которые разворачиваются макро-
сы assert, исчезнут. Таким образом вы можете одной строкой отключить множест-
во отладок, которые разбросаны по разным фрагментам вашей программы. При
этом отладки не просто перестанут работать, но они исчезнут из результирующего
выполняемого модуля, так что не будут увеличивать его размер и потреблять вы-
числительные ресурсы.

Впрочем, возможности assert слишком скромны, чтобы дать достаточную для
отладки информацию. Вы легко можете сами определить свой макрос с более ши-
рокими возможностями, позволяющий включать любые переданные в него сооб-
щения. В качестве примера ниже приведен текст макроса MyWarning, который
построен по принципу assert, но позволяет отобразить дополнительное переданное
в него сообщение msg. Только обратите внимание на то, что директива, следующая
после строки комментария, должна быть записана в тексте вашего модуля в одну
строку, без переносов. В приведенном тексте переносы введены просто из-за того,
что при печати книги он не может уместиться в одну строку.

ftifdef NDEBUG

ftdefine MyWarning(p,msg)    ((void)O)

Itelse

// следующая директива должна быть записана в одну строку

ftdefine MyWarning(p,msg) ((p) ?(void)0 : (ShowMessage((msg)+

", ("+AnsiString(#p)+")\пфайл " + AnsiString( FILE ) +

", строка " + IntToStr(_LINE_)))),
#endif

Чтобы воспользоваться этим макросом в нашем примере, можете вставить в
цикл оператор

MyWarningfA < 1е300, "А = " -t-FloatToStr (А) + ", i = " + IntToStr (i) ) ;

В момент, когда значение переменной А, превысит 10300, этот макрос выдаст
сообщение вида, показанного на рис. 2.51.

Рис. 2.51

Сообщение вашего макроса MyWarning

"Ж"

Если вы хотите не просто отобразить сообщение, но и завершить программу,
проще объявить некоторую функцию, в вызов которой развертывать макрос. В ка-
честве примера ниже приведен макрос и соответствующая функция, обеспечиваю-
щие примерно те же функции, что и рассмотренный выше макрос, но завершаю-
щие работу приложения.

ttifdef NDEBUG

^define MyAssert(p,msg)    ((void)O)

ttelse

// следующая директива должна быть записана в одну строку

ftdefine MyAssert(p,msg) ((p) ?(void)0 :

(FMyAssert((msg),_FILE_,_LINE_)))
ftendif

void FMyAssert(String msg. String sFile, int Line)
{

ShowMessage((msg)+"\пфайл " + sFile + ", строка " +
IntToStr(Line)) ;

abort();