Правила программирования на Си и Си++


Не используйте системно-зависимых функций для сообщений об ошибках


Многие среды с оконным интерфейсом не поддерживают понятия стандартного устройства для вывода или для сообщений об ошибках. (В этих средах вызовы 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



Содержание раздела