सी

2009-04-27 12 views
17

में फ़ंक्शन पॉइंटर की रिकर्सिव घोषणा, मैं एक ऐसा फ़ंक्शन घोषित करना चाहता हूं जो एक ही प्रकार के फ़ंक्शन पर पॉइंटर लौटाता हो।सी

मैं इसे उपयोग करने के लिए नीचे दिए गए एक तरह राज्य मशीनों को लागू करना चाहते हैं:

typedef event_handler_t (*event_handler_t)(event_t*); // compilation error 

event_handler_t state2(event_t* e); 
event_handler_t state1(event_t* e) { 
    switch(e->type) { 
    //... 
    case SOME_EVENT: 
     return state2; 
    //... 
    } 

} 
event_handler_t state2(event_t* e) { 
    switch(e->type) { 
    //... 
    case OTHER_EVENT: 
     return state1; 
    //... 
    } 
} 

//... 
event_handler_t event_handler; 
//... 
event_handler(&e); 
//... 

मैं संरचनाओं का उपयोग कर के रूप में इस compliation त्रुटि को हल करने के लिए प्रबंधन:

typedef struct event_handler { 
    struct event_handler (*func)(event_t *); 
} event_handler_t; 

लेकिन इस वापसी बनाता है स्टेटमेंट अधिक जटिल:

event_handler_t state2(event_t* e) { 
{ 
    event_handler_t next_handler = {NULL}; 
    switch(e->type) { 
    //... 
    case OTHER_EVENT: 
     next_handler.func = state1; 
     break; 
    //... 
    } 
    return next_handler; 
} 

मुझे आश्चर्य है कि क्या बनाने का एक बेहतर तरीका है सी में ऐसे फ़ंक्शन पॉइंटर्स।

+1

यह भी देखें: [SO 816356] (http://stackoverflow.com/questions/816356/how-can-i-typedef-a-function-pointer-that-takes-a- कार्यक्षमता-of-its-own -प्रकार-ए-ए) –

उत्तर

7

सी में ऐसा करना संभव नहीं है: एक फ़ंक्शन एक पॉइंटर वापस नहीं कर सकता है, क्योंकि प्रकार की घोषणा बार-बार फैली हुई है और कभी खत्म नहीं होती है। इस पृष्ठ को स्पष्टीकरण के लिए देखें: http://www.gotw.ca/gotw/057.htm

उपर्युक्त पृष्ठ पर वर्णित कार्यवाही का अर्थ है सही ढंग से टाइप किए गए फ़ंक्शन पॉइंटर के बजाय void (*)(); आपका कामकाज तर्कसंगत रूप से थोड़ा साफ है।

+0

एर, अच्छा बिंदु। –

2

यह "डाले के उपयोग के बिना नहीं" हर्ब Sutter की किताब अधिक असाधारण सी ++, मद 32, जहां जवाब (सी के लिए) हो रहा है में चर्चा की है। सी ++ के लिए कुछ अतिरिक्त संकेत प्रदान करने के लिए कक्षा के सामान्य परिचय के साथ संभव है।