Правила программирования на С и С++. Главы 1-6
Страница 85. Не используйте системно-зависимых функций для сообщений об ошибках


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

 
« Предыдущая статья