Правила программирования на С и С++. Главы 1-6 - Не используйте системно-зависимых функций для сообщений об ошибках
ОГЛАВЛЕНИЕ
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