2012-09-14 88 views
2

我本来希望给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"; 
} 
  1. 一个人知道枚举尺寸并具有手动设置E_COUNT为3
  2. 一个无法到达后for循环的回报,在那里做什么?
  3. 有没有更好的解决方案?

回答

1
  1. 您可以从sizeof(errordesc)/sizeof(struct _errordesc)计算E_COUNT
  2. 如果到达循环的结尾,只需返回"Unknown error"或类似的东西。
  3. 由于您的错误代码似乎是连续的(但为负数),您可以使用-errnum直接将数据索引到数组中。
+0

的错误代码是唯一连续的,因为我复制他们从原来的例子。我不想依赖这个事实。 –

+0

@MichaWiedenmann那么我认为你现在的解决方案很好。您应该按照1中的建议计算错误代码的数量。 – rasmus

0

更好的选择是确保您的所有错误代码从0向上(或向下)都有连续的值。然后你可以使用它们作为errordesc[]的索引。当然,如果他们是负面的,你会做类似errordesc[-errnum]

关于errordesc[]的条目数,是sizeof(errordesc)/sizeof(errordesc[0])。您可以将其存储在全局变量中。

还有用C bsearch() ...

+1

如果使用错误代码作为'errordesc []'的索引,则必须手动跟踪以确保没有错误。我也喜欢错误代码在他们的描述旁边。 –