2011-06-09 80 views
6

我正在寫一個簡單的解析器讀取配置文件。該接口的config.h只有三個 他們在簡略如下主要功能,Ç命名建議

config_init(); 
config_dinit(); 
config_parse(); 
config_read_value(); 

我的問題是這些功能將發射不同類型的錯誤,對於一個示例,

config_init() emit , FILE_NOT_FOUND,FILE_EOF_ERROR,FILE_OPEN_ERROR, ... 
config_dinit() emit , NOT_INIT_ERROR , 
config_parse() emit , PARSE_ERROR, OVERFLOW_ERROR, INVALID_CHARACTER_FOUND_ERROR,... 
config_read_value() emit, SECTION_NOT_FOUND,KEYWORD_NOT_FOUND,OVERFLOW_ERROR,NOT_INITIALIZED_ERROR,INVALID_STATE_ERROR,... etc. 

Then I create enums for each function, for by using these names , 
enum Config_ParseError{...} , enum Config_InitError{...} ,enum Config_ReadValueError{..} 
etc. 

一些枚舉值相互重疊並點擊「編譯器錯誤」過。像 溢出錯誤,

我打開您的建議,

,我已經做了谷歌的快速調研,發現最流行的IRC客戶端 源代碼已經定義了這樣的枚舉,

enum { 
    CMDERR_OPTION_UNKNOWN = -3, /* unknown -option */ 
    CMDERR_OPTION_AMBIGUOUS = -2, /* ambiguous -option */ 
    CMDERR_OPTION_ARG_MISSING = -1, /* argument missing for -option */ 

    CMDERR_UNKNOWN, /* unknown command */ 
    CMDERR_AMBIGUOUS, /* ambiguous command */ 

     CMDERR_ERRNO, /* get the error from errno */ 
    CMDERR_NOT_ENOUGH_PARAMS, /* not enough parameters given */ 
    CMDERR_NOT_CONNECTED, /* not connected to server */ 
    CMDERR_NOT_JOINED, /* not joined to any channels in this window */ 
    CMDERR_CHAN_NOT_FOUND, /* channel not found */ 
    CMDERR_CHAN_NOT_SYNCED, /* channel not fully synchronized yet */ 
    CMDERR_ILLEGAL_PROTO, /* requires different chat protocol than the active server */ 
    CMDERR_NOT_GOOD_IDEA, /* not good idea to do, -yes overrides this */ 
    CMDERR_INVALID_TIME, /* invalid time specification */ 
    CMDERR_INVALID_CHARSET, /* invalid charset specification */ 
    CMDERR_EVAL_MAX_RECURSE, /* eval hit recursion limit */ 
    CMDERR_PROGRAM_NOT_FOUND /* program not found */ 
}; 

它定義的enum沒有任何名稱,那是一個很好的風格嗎?那麼爲什麼 那個原因是什麼呢?

嚴重需要一些更好的命名決定。請不要傷害我我只是 開始閱讀「寫美麗的C代碼」一書。

在此先感謝。 Sandun。

回答

18

我通常是很整個庫的一組錯誤返回的風扇。這種方式在消費者中,他們不必擔心「是X的-1輸入錯誤或無法連接到Y」

我也E_前綴的粉絲,但算不上什麼都行:

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" }, 
    ... 
}; 
+1

哇好建議標題先生, – 2011-06-09 13:30:11

+0

'類型定義枚舉_config_error error_t;'爲我工作。 – Danijel 2017-04-07 07:06:11

2

我認爲這是很好的風格。 CMDERR_前綴將相關的錯誤代碼組合在一起(假設它們與某種「命令調用/執行」有關)

由於您的所有示例似乎都與您的配置功能相關,因此我只需要一個使用CONFIG_前綴的枚舉定義(或簡稱爲CFG_)。

enum Config_Errors { 
    CONFIG_FILE_NOT_FOUND, 
    CONFIG_FILE_EOF_ERROR, 
    CONFIG_FILE_OPEN_ERROR, 
    //etc. 
}; 

背後的公共前綴的原因是使用枚舉類型,當你想清楚該類型的成員都屬於同一組。

2

在IRC客戶端源代碼中的CMDERR_前綴是一個很好的風格,但定義枚舉沒有任何名稱是不是一個好的風格。不是好事,因爲你不能說這是一個枚舉類型,只有整數類型如下圖所示:

CMDERR function1(); 

int function1(); // actually returning CMDERR unnamed enum 

,並使用像下面的枚舉類型不能定義變量:

CMDERR errResult; 

int errResult; // actually errResult is CMDERR unnamed enum