Как я могу использовать assert() без использования abort()?

glib's error reporting functions используйте подход продолжения exception после утверждения. glib — это custom-exceptions базовая библиотека, независимая cpp от платформы, которую использует cxx Gnome (через GTK). Вот макрос, который exception-handling проверяет предварительное exceptions условие и печатает трассировку cxx стека, если предварительное exception условие не выполняется.

#define RETURN_IF_FAIL(expr)      do {                  \
 if (!(expr))                                           \
 {                                                      \
         fprintf(stderr,                                \
                "file %s: line %d (%s): precondition `%s' failed.", \
                __FILE__,                                           \
                __LINE__,                                           \
                __PRETTY_FUNCTION__,                                \
                #expr);                                             \
         print_stack_trace(2);                                      \
         return;                                                    \
 };               } while(0)
#define RETURN_VAL_IF_FAIL(expr, val)  do {                         \
 if (!(expr))                                                       \
 {                                                                  \
        fprintf(stderr,                                             \
                "file %s: line %d (%s): precondition `%s' failed.",     \
                __FILE__,                                               \
                __LINE__,                                               \
                __PRETTY_FUNCTION__,                                    \
                #expr);                                                 \
         print_stack_trace(2);                                          \
         return val;                                                    \
 };               } while(0)

Вот cpp функция, которая печатает custom-exceptions трассировку стека, написанная c++ для среды, использующей набор exception инструментов gnu (gcc):

void print_stack_trace(int fd)
{
    void *array[256];
    size_t size;

    size = backtrace (array, 256);
    backtrace_symbols_fd(array, size, fd);
}

Вот cpp как вы будете использовать assert макросы:

char *doSomething(char *ptr)
{
    RETURN_VAL_IF_FAIL(ptr != NULL, NULL);  // same as assert(ptr != NULL), but returns NULL if it fails.

    if( ptr != NULL )        // Necessary if you want to define the macro only for debug builds
    {
       ...
    }

    return ptr;
}

void doSomethingElse(char *ptr)
{
    RETURN_IF_FAIL(ptr != NULL);
}

c++

exception

assert

2022-10-05T00:23:29+00:00
Вопросы с похожей тематикой, как у вопроса:

Как я могу использовать assert() без использования abort()?