Преобразование Кода Ошибки Перечисления В Строку
В проекте, над которым я работаю, я определил базовый 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 ответ:
Предложенное вами резервное решение функции, возвращающей строки для каждого из разрывных кодов ошибок, кажется мне хорошим решением.
Хорошим решением для того, чтобы держать
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; }