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

时间:2015-01-16 17:51:33

标签: 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
}

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

printf("Error Description: %s\n", ERROR_DESCRIPTIONS[RESULT]);

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

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


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

1 个答案:

答案 0 :(得分:6)

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

一个很好的解决方案,可以保持enum和消息排列,并确保每个枚举值都有消息X macros。 (我现在看到Weather Vane通过发布link来击败我这个答案。)

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

#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;
}