2

この質問 への回答にコメントを追加したかったのですが、十分なポイントがありませんでした。次のコードを検討してください。

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か?私が思いついたバージョンには2つの問題があります。

/* 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_COUNT3に設定する必要があります。
  2. forループの後でリターンに到達できません。そこで何をしますか?
  3. より良い解決策はありますか?
4

2 に答える 2

1
  1. E_COUNTから計算できますsizeof(errordesc) / sizeof(struct _errordesc)
  2. ループの最後に到達したら、単純に戻る"Unknown error"か、同様のことを行います。
  3. エラーコードは連続しているように見えるため(ただし負)、を使用して配列に直接インデックスを付けることができます-errnum
于 2012-09-14T11:56:34.770 に答える
0

より良いオプションは、すべてのエラー コードに 0 から上 (または下) までの連続した値があることを確認することです。次に、それらを へのインデックスとして使用できますerrordesc[]。もちろん、それらが負の場合は、次のようにしerrordesc[-errnum]ます。

のエントリー数はerrordesc[]ですsizeof(errordesc)/sizeof(errordesc[0])。グローバル変数に格納できます。

bsearch()Cにもあります...

于 2012-09-14T11:56:47.450 に答える