Страница 85 из 93 78. Не используйте системно-зависимых функций для сообщений об ошибках.
Многие среды с оконным интерфейсом не поддерживают понятия стандартного устройства для вывода или для сообщений об ошибках. (В этих средах вызовы printf() или fprintf(stderr, ...) обычно игнорируются). Если вы будете основываться на догадках о своей среде, то обнаружите, что вам необходимы значительные доработки просто для того, чтобы перекомпилировать код для новой среды). Минимум вашей защиты может быть таким: #define ошибка printf #define завершить(x) ExitProcess(x) после чего используйте: if ( некая_ошибка ) { ошибка("Тут что-то не так "); завершить( -1 ); }Вот более гибкое решение: #include ?stdio.h> #include ?sdarg.h> #ifdef WINDOWS void error( const char* format, ... ) { char buf[255]; // надеемся, что такой размер будет достаточен va_list args; va_start( args, format ); if ( vsprintf( buf, format, args ) ? sizeof(buf) ) ::MessageBox(NULL, buf, "*** ОШИБКА ***", MB_OK | MB_ICONEXCLAMATION );else { ::MessageBox(NULL, "Переполнение буфера при печати сообщения об ошибке.", "Фатальная ошибка", MB_OK | MB_ICONEXCLAMATION ); ExitProcess( -1 );} va_end( args ); } #elif MOTIF // Здесь следует функция обработки ошибки, используемая в ОС Motif#else void error( const char* format, ... ) { va_list args; va_start( args, format ); vfprintf(stderr, format, args ); va_end ( args ); }#endif |