2011-06-09 10 views
6

मैं config file.The 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. 

कुछ enum मूल्यों को एक दूसरे अतिव्यापी हैं और हिट "संकलक त्रुटि" भी। जैसे OVERFLOW_ERROR,

मैं अपने सुझाव के लिए खोलने रहा हूँ,

और मैं गूगल पर एक त्वरित शोध किया और पाया कि सबसे लोकप्रिय आईआरसी ग्राहक स्रोत कोड इस तरह enums परिभाषित किया है है,

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 परिभाषित करता है, क्या यह एक अच्छी शैली है? तो के कारण क्यों हैं?

गंभीरता से कुछ और अच्छे नामकरण निर्णयों की आवश्यकता है। कृपया मुझे चोट न दें मैं केवल "सुंदर सी कोड लिखना" पुस्तक पढ़ना शुरू करता हूं।

अग्रिम में धन्यवाद। सांडुन।

उत्तर

18

मैं आमतौर पर एक हूँ एक संपूर्ण पुस्तकालय के लिए त्रुटि रिटर्न के एक सेट के प्रशंसक। उपभोक्ताओं में इस तरह उन्हें के बारे में चिंता करने की ज़रूरत नहीं है "एक्स में -1 खराब इनपुट था या वाई से कनेक्ट नहीं हो सका"

मैं भी 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

वाह अच्छी सलाह शीर्षक महोदय, –

+0

'typedef enum _config_error error_t;' मेरे लिए काम करता है। – Danijel

2

मुझे राय है कि अच्छी शैली है। सीएमडीईआरआर_ उपसर्ग समूह एक साथ संबंधित त्रुटि कोड (मानते हैं कि वे किसी प्रकार के "कमांड आमंत्रण/निष्पादन" से संबंधित हैं)

चूंकि आपके सभी उदाहरण आपके कॉन्फ़िगरेशन फ़ंक्शंस से संबंधित प्रतीत होते हैं, मैं बस साथ जाऊंगा CONFIG_ उपसर्ग (या ब्रेवटी के लिए CFG_) का उपयोग करके एक enum परिभाषा।

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

आम उपसर्ग के पीछे तर्क यह है कि जब एक enumerated प्रकार का उपयोग कर आप यह स्पष्ट है कि प्रकार के सदस्यों सभी एक ही समूह के हैं बनाना चाहते है।

2

आईआरसी क्लाइंट स्रोत कोड में CMDERR_ उपसर्ग एक अच्छी शैली है, लेकिन किसी भी नाम के बिना enum परिभाषित एक अच्छी शैली नहीं है। अच्छा नहीं है क्योंकि आप यह नहीं कह सकते कि यह एक enum प्रकार, नीचे की तरह केवल एक पूर्णांक प्रकार है:

CMDERR function1(); 

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

और आप का उपयोग कर नीचे की तरह enum प्रकार चर को परिभाषित नहीं कर सकते हैं:

CMDERR errResult; 

int errResult; // actually errResult is CMDERR unnamed enum 
संबंधित मुद्दे