Не используйте системно-зависимых функций для сообщений об ошибках
Многие среды с оконным интерфейсом не поддерживают понятия стандартного устройства для вывода или для сообщений об ошибках. (В этих средах вызовы printf() или
fprintf(stderr, ...) обычно игнорируются). Если вы будете основываться на догадках о своей среде, то обнаружите, что вам необходимы значительные доработки просто для того, чтобы перекомпилировать код для новой среды).
Минимум вашей защиты может быть таким:
#define error printf
#define terminate(x) ExitProcess(x)
после чего используйте:
if ( some_error )
{
error("Тут что-то не так ");
terminate( -1 );
}
Вот более гибкое решение:
#include stdio.h
#include stdarg.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