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

3

在我正在处理的项目中,我定义了一个基本的枚举来存储应用可能遇到的错误列表。然而,我想找到一种方法来返回描述错误的字符串。

这是我正在使用的枚举:

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 语句返回一个描述,但这只是一个后备方案,如果没有更好的选择。
编辑:为了更好地说明,我需要一种将枚举中的结果代码与描述它们的字符串相关联的方法。

所以你的意思是需要将你的枚举值与字符串关联起来?如果是这样,那么它必须是预定义的,不是吗?我的意思是,除了枚举之外,还必须定义字符串? - Gopi
@Gopi,是的,那正是我想做的。是的,我会预先定义与错误代码相关联的字符串描述。 - Spencer D
1
编写switch语句和其他语句一样简单,甚至可能更简单。由于这些是错误代码描述,执行时间很可能不是问题,所以我建议您继续前进。易于编写和维护。 - Weather Vane
2
这里有一个有趣的答案。https://dev59.com/pmkw5IYBdhLWcg3waZ74 - Weather Vane
实际上,那看起来很有前途。非常感谢你,@WeatherVane。我不确定那是否会是我要实现的解决方案,但那看起来很有用。 - Spencer D
1个回答

7
您提出的针对不连续错误代码返回字符串的函数备选方案,看起来是一个很好的解决方案。
一种良好的解决方案是使用 X 宏,以保持枚举和消息的一致,并确保每个枚举值都有其相应的消息。这样做可以通过X 宏实现。(我现在看到 Weather Vane 已经在链接中回答了这个问题。)
以下是如何应用 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;
}

我从未听说过X宏,所以我需要去了解一下。不过这似乎是一个非常优秀和干净的解决方案!非常感谢。 - Spencer D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接