将枚举错误代码转换为字符串
Converting Enum Error Code To String
在我正在进行的项目中,我定义了一个基本的 enum
来存储应用程序可能遇到的错误列表。但是,我想找到一种方法来 return 描述错误的字符串。
这是我正在使用的枚举:
enum _library_results_enum{
LIB_SUCCESS = 1,
LIB_FAIL,
LIB_NULL_PARAM,
LIB_MALLOC_ERROR,
LIB_TIMEOUT,
LIB_CONNECTION_CLOSED
}
如果函数 return 的结果不是 LIB_SUCCESS
,那么理想情况下我希望能够说:
printf("Error Description: %s\n", ERROR_DESCRIPTIONS[RESULT]);
为了处理这个问题,我想我需要一个 static const *char[]
来容纳所有描述的数组。但是,enum
值并非从零 (0) 开始,最终我可能会向该枚举添加一些负值。因此,使用字符串数组并不是真正的选择。我还能做些什么来处理这个问题?
我考虑过只创建一个使用 switch 语句来 return 返回描述的函数。但是,如果没有更好的选择,这实际上只是一个后备解决方案。
编辑:为了更好地阐明,我需要的是一种将枚举中的结果代码与描述它们的字符串相关联的方法。
你提出的函数后备解决方案 returns 字符串用于每个不连续的错误代码对我来说是一个很好的解决方案。
一个很好的解决方案,可以使 enum
和消息保持一致,并确保每个枚举值都有其消息 X macros. (I now see that Weather Vane has beaten me to this answer by posting a 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;
}
在我正在进行的项目中,我定义了一个基本的 enum
来存储应用程序可能遇到的错误列表。但是,我想找到一种方法来 return 描述错误的字符串。
这是我正在使用的枚举:
enum _library_results_enum{
LIB_SUCCESS = 1,
LIB_FAIL,
LIB_NULL_PARAM,
LIB_MALLOC_ERROR,
LIB_TIMEOUT,
LIB_CONNECTION_CLOSED
}
如果函数 return 的结果不是 LIB_SUCCESS
,那么理想情况下我希望能够说:
printf("Error Description: %s\n", ERROR_DESCRIPTIONS[RESULT]);
为了处理这个问题,我想我需要一个 static const *char[]
来容纳所有描述的数组。但是,enum
值并非从零 (0) 开始,最终我可能会向该枚举添加一些负值。因此,使用字符串数组并不是真正的选择。我还能做些什么来处理这个问题?
我考虑过只创建一个使用 switch 语句来 return 返回描述的函数。但是,如果没有更好的选择,这实际上只是一个后备解决方案。
编辑:为了更好地阐明,我需要的是一种将枚举中的结果代码与描述它们的字符串相关联的方法。
你提出的函数后备解决方案 returns 字符串用于每个不连续的错误代码对我来说是一个很好的解决方案。
一个很好的解决方案,可以使 enum
和消息保持一致,并确保每个枚举值都有其消息 X macros. (I now see that Weather Vane has beaten me to this answer by posting a 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;
}