Преобразование Кода Ошибки Перечисления В Строку


В проекте, над которым я работаю, я определил базовый enum для хранения списка возможных ошибок, с которыми может столкнуться приложение. Однако я хотел бы найти способ вернуть строку, описывающую ошибку.

Вот перечисление, которое я использую:

enum _library_results_enum{
    LIB_SUCCESS = 1,
    LIB_FAIL,
    LIB_NULL_PARAM,
    LIB_MALLOC_ERROR,
    LIB_TIMEOUT,
    LIB_CONNECTION_CLOSED
}

Если функция возвращает результат, отличный от LIB_SUCCESS, то в идеале я хотел бы просто сказать:

printf("Error Description: %sn", ERROR_DESCRIPTIONS[RESULT]);

Чтобы справиться с этим, я бы предположил, что мне нужен static const *char[], чтобы разместить массив всех описаний. Тем не менее, enum значения не начинаются с нуля (0), и в конечном итоге я мог бы добавить некоторые отрицательные значения к этому перечислению. Таким образом, использование массива строк на самом деле не вариант. Что еще я мог сделать, чтобы справиться с этим?

Я рассматривал только создание функции, которая использует оператор switch для возврата описания. Однако на самом деле это просто запасной вариант, если нет лучшего варианта.


Edit : чтобы лучше понять, что мне нужно, это способ связать коды результатов внутри перечисление в строку, описывающую их.

1 2

1 ответ:

Предложенное вами резервное решение функции, возвращающей строки для каждого из разрывных кодов ошибок, кажется мне хорошим решением.

Хорошим решением для того, чтобы держать enum и сообщения выстроенными и гарантировать, что каждое перечисляемое значение имеет свое сообщение, являютсяx макросы . (Теперь я вижу, что флюгер опередил меня в этом ответе, разместив ссылку .)

Вот как это может выглядеть применительно к вашей проблеме:

#include <stdlib.h>
#include <stdio.h>

#define ERROR_CODES(X)                                          \
    X(0,    LIB_SUCCESS,            "No error at all!")         \
    X(10,   LIB_FAIL,               "An error occurred")        \
    X(20,   LIB_NULL_PARAM,         "Illegal null param")       \
    X(30,   LIB_MALLOC_ERROR,       "Allocation failed")        \
    X(40,   LIB_TIMEOUT,            "Connection timed out")     \
    X(-5,   LIB_CONNECTION_CLOSED,  "Connection closed")        \

#define ERROR_ENUM(ID, NAME, TEXT) NAME = ID,
#define ERROR_TEXT(ID, NAME, TEXT) case ID: return TEXT;

enum {
    ERROR_CODES(ERROR_ENUM)
};

const char *error_msg(int code)
{
    switch (code) {
        ERROR_CODES(ERROR_TEXT)
    }

    return "Unknown error";
}

int main()
{
    puts(error_msg(LIB_TIMEOUT));
    puts(error_msg(LIB_CONNECTION_CLOSED));
    puts(error_msg(LIB_SUCCESS));

    return 0;
}