2013-04-17 11 views
12

मैं इस कोड है जहाँ से Tcl documentationसमझना सी typedef

typedef int Tcl_DriverOutputProc(
     ClientData instanceData, 
     const char *buf, 
     int toWrite, 
     int *errorCodePtr); 

है मुझे पता है के रूप में typedef के प्रयोजन के मौजूदा प्रकार के लिए वैकल्पिक नाम आवंटित करने के लिए है समझने की कोशिश कर रहा हूँ, तो क्यों कार्य करने के लिए पूर्णांक typedef करने की जरूरत है? इसका उपयोग कैसे किया जा सकता है?

+0

यह घोषणा करने के लिए [समारोह संकेत] प्रयोग किया जाता है (http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work) TCL_CHANNELTYPE – alexrider

+0

में तुम क्या समझते हो यह (typedef int (* हैलो) (शून्य);)? – MYMNeo

उत्तर

16

मैं जानता हूँ कि typedef के प्रयोजन के मौजूदा प्रकार

वास्तव में करने के लिए वैकल्पिक नाम आवंटित है। कार्यों में प्रकार होते हैं, और यह इस फ़ंक्शन प्रकार में Tcl_DriverOutputProc नाम निर्दिष्ट करता है। समारोह प्रकार ही नाम नहीं है के साथ एक समारोह की तरह लिखा है:

int(ClientData, const char *, int, int *) 

और एक समारोह घोषणा के साथ के रूप में, आप मापदंडों के लिए नामों में शामिल हैं या उन्हें बाहर छोड़ देते हैं, के रूप में आप चुन सकते हैं।

इसका उपयोग कैसे किया जा सकता है?

आप रन-टाइम पर व्यवहार निर्दिष्ट करने के लिए पॉइंटर्स का उपयोग फ़ंक्शंस का उपयोग कर सकते हैं; उदाहरण के लिए:

typedef void function(); 
void hello() {printf("Hello\n");} 
void goodbye() {printf("Goodbye\n");} 

int main() { 
    function * pf = hello; 
    pf(); // prints "Hello" 
    pf = goodbye; 
    pg(); // prints "Goodbye" 
} 

इस मामले में, यह आप TCL उत्पादन के कुछ पहलू को संभालने के लिए एक समारोह लिखते हैं, और TCL बताया कि समारोह का उपयोग करने के लिए अनुमति देता है।

+0

वाह, यह नहीं पता था कि आप * * * में वास्तविक फ़ंक्शन प्रकार (सामान्य पॉइंटर-टू-फ़ंक्शन टाइपिफ़ाफ़ के विपरीत) के लिए टाइपिफ़ बना सकते हैं। लेकिन मुझे लगता है कि * सी * में एकमात्र संभावित उपयोग केस वास्तव में पॉइंटर चर बनाने के लिए है (और इस प्रकार सामान्य तरीका टाइपर को पहले स्थान पर टाइप करना है)। लेकिन अभी भी जानना अच्छा लगा। –

+2

@ क्रिस्टियन राउ: आप फ़ंक्शन घोषित करने के लिए फ़ंक्शन टाइपिफ़ का भी उपयोग कर सकते हैं, हालांकि जब भी आप इसे परिभाषित करते हैं तो आपको सामान्य फ़ंक्शन-घोषणा सिंटैक्स की आवश्यकता होती है; और सी ++ फ़ंक्शन प्रकारों में अक्सर टेम्पलेट तर्क के रूप में उपयोग किया जाता है (उदा। 'std :: function ')। –

+0

हाँ, अंत में * सी ++ * * प्रकार * का अधिक उपयोग करता है, इसे ओवरलोडिंग, टेम्पलेट्स, ...और मैंने सोचा कि यह * फ़ंक्शन-प्रकार * सिंटैक्स * सी ++ 11 * का एक उपन्यास था, जिसे 'std :: result_of' और 'std :: function' जैसी चीजों के साथ पेश किया गया था। अभी भी कुछ पुराने चीजें * सी * के बारे में जानने के लिए;) –

0

फ़ंक्शन प्रकारों के लिए टाइपपीफ का सिंटैक्स विचित्र है - आप जिस प्रकार का नाम बना रहे हैं वह मध्य में दिखाई देता है। जैसा कि माइक सेमुर ने पहले ही कहा है, यह Tcl_DriverOutputProc नाम फ़ंक्शन प्रकार int(ClientData, const char *, int, int *) पर निर्दिष्ट करता है।

+2

खैर, अजीब ... यह बिल्कुल उसी स्थान पर दिखाई देता है जहां फ़ंक्शन का नाम गैर-टाइप किए गए घोषणा में प्रकट होता है। – Angew

3

टाइपपीफ का उपयोग फ़ंक्शन घोषित करने के लिए भी किया जा सकता है "function_name" और यह "function_name" का उपयोग उसी प्रकार और पैरामीटर के साथ एक और फ़ंक्शन घोषित करने के लिए किया जा सकता है।

typedef function_name(int, int); 

function_name function1; 
function_name *function2; 

यहाँ, आपके मामले में typedef बयान की घोषणा "Tcl_DriverOutputProc" समारोह के लिए प्रयोग किया जाता है। और "* outputProc" घोषित करने के लिए "Tcl_DriverOutputProc" का उपयोग "संरचना Tcl_ChannelType" में किया जाता है।

"संरचना Tcl_ChannelType" Tcl दस्तावेज़ के आखिरी में है।

typedef struct Tcl_ChannelType { 
    const char *typeName; 
    Tcl_ChannelTypeVersion version; 
    Tcl_ DriverCloseProc *closeProc; 
    Tcl_DriverInputProc *inputProc; 
    Tcl_DriverOutputProc *outputProc; // <-- DriverOutputproc is used here. 
    Tcl_DriverSeekProc *seekProc; 
    Tcl_DriverSetOptionProc *setOptionProc; 
    Tcl_DriverGetOptionProc *getOptionProc; 
    Tcl_DriverWatchProc *watchProc; 
    Tcl_DriverGetHandleProc *getHandleProc; 
    Tcl_DriverClose2Proc *close2Proc; 
    Tcl_DriverBlockModeProc *blockModeProc; 
    Tcl_DriverFlushProc *flushProc; 
    Tcl_DriverHandlerProc *handlerProc; 
    Tcl_DriverTruncateProc *truncateProc; 
}Tcl_ChannelType; 
संबंधित मुद्दे