将枚举错误代码转换为字符串

Spe*_*r D 3 c error-handling enums

在我正在进行的项目中,我已经定义了一个基本enum来存储应用程序可能遇到的错误列表.但是,我想找到一种方法来返回描述错误的字符串.

这是我正在使用的枚举:

enum _library_results_enum{
    LIB_SUCCESS = 1,
    LIB_FAIL,
    LIB_NULL_PARAM,
    LIB_MALLOC_ERROR,
    LIB_TIMEOUT,
    LIB_CONNECTION_CLOSED
}
Run Code Online (Sandbox Code Playgroud)

如果函数返回的结果不是LIB_SUCCESS,那么理想情况下我希望能够说:

printf("Error Description: %s\n", ERROR_DESCRIPTIONS[RESULT]);
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我想我需要一个static const *char[]包含所有描述的数组.但是,enum值不会从零(0)开始,最终我可能会为此枚举添加一些负值.因此,使用字符串数组实际上不是一种选择.我还能做些什么来处理这件事?

我考虑过只创建一个使用switch语句返回描述的函数.但是,如果没有更好的选择,这实际上只是一个后备解决方案.


编辑:为了更好地说明,我需要的是一种将枚举中的结果代码与描述它们的字符串相关联的方法.

M O*_*ehm 7

您提出的函数的后备解决方案为每个不连续的错误代码返回字符串对我来说是一个很好的解决方案.

保持enum和消息排列并确保每个枚举值都有其消息的一个很好的解决方案是X宏.(我现在看到Weather Vane通过发布链接打败了我的答案.)

以下是您的问题可能适用的方式:

#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;
}
Run Code Online (Sandbox Code Playgroud)