我本来希望在the answer to this question 添加评论,但没有足够的分数。请考虑以下代码:
enum _config_error
{
E_SUCCESS = 0,
E_INVALID_INPUT = -1,
E_FILE_NOT_FOUND = -2, /* consider some way of returning the OS error too */
...
};
/* type to provide in your API */
typedef _config_error error_t;
/* use this to provide a perror style method to help consumers out */
struct _errordesc {
int code;
char *message;
} errordesc[] = {
{ E_SUCCESS, "No error" },
{ E_INVALID_INPUT, "Invalid input" },
{ E_FILE_NOT_FOUND, "File not found" },
...
};
如何从errordesc
查找错误说明?我可以看到我提出的版本有两个问题:
/* add E_COUNT = 3 to enum _config_error */
const char *errorstring(error_t errnum)
{
unsigned int i;
for (i = 0; i < E_COUNT; ++i) {
if (errordesc[i].code == errnum) {
return errordesc[i].message;
}
}
return "Can't reach this point";
}
E_COUNT
设置为3。答案 0 :(得分:1)
E_COUNT
计算sizeof(errordesc) / sizeof(struct _errordesc)
。"Unknown error"
或类似内容。-errnum
直接索引到数组中。答案 1 :(得分:0)
更好的选择是确保所有错误代码都具有从0开始(或关闭)的连续值。然后,您可以将它们用作errordesc[]
的索引。当然,如果它们是否定的,你会做errordesc[-errnum]
。
至于errordesc[]
中的条目数,它是sizeof(errordesc)/sizeof(errordesc[0])
。您可以将其存储在全局变量中。
C中还有bsearch()