सी

2010-04-09 4 views
62

में नेस्टेड फ़ंक्शन क्या हमारे पास सी में घोंसला वाला कार्य हो सकता है? नेस्टेड कार्यों का उपयोग क्या है? यदि वे सी में मौजूद हैं तो उनका कार्यान्वयन कंपाइलर से कंपाइलर से भिन्न होता है?सी

किसी अन्य भाषा में नेस्टेड फ़ंक्शंस की अनुमति है? यदि हां, तो उनका महत्व क्या है?

+1

का डुप्लिकेट लगता है: http://stackoverflow.com/questions/1348095/why-are-nested-functions-not-supported-by- सी-सी-मानक – zoli2k

+1

भी http://stackoverflow.com/questions/666586/are-nested-functions-part-of-c- मानक और http://stackoverflow.com/questions/2256647/is-it- संभावित -in-c-or-c-to-create-a-function-inside-other और http://stackoverflow.com/questions/957592/functions-inside-functions-in-c और अन्य http: // से लिया गया stackoverflow.com/search?q=nested+functions+[c] – dmckee

+0

पायथन का उपयोग करें, यह आसान है। –

उत्तर

76

आप मानक सी

में एक और समारोह के भीतर एक समारोह को परिभाषित नहीं कर सकते आप एक समारोह घोषणा कर सकते हैं एक समारोह के अंदर है, लेकिन यह एक नेस्टेड समारोह नहीं है।

जीसीसी में a language extension that allows nested functions है। वे गैर मानक हैं, और जैसे कि पूरी तरह से संकलक-निर्भर हैं।

26

नहीं, वे मौजूद नहीं है सी

में

वे (कम से कम) दो कारणों के लिए पास्कल जैसी भाषाओं में उपयोग किया जाता है:

  1. वे नामस्थान को दूषित किए बिना कार्यात्मक अपघटन अनुमति देते हैं। आप एक सार्वजनिक रूप से दृश्यमान फ़ंक्शन को परिभाषित कर सकते हैं जो छोटे लॉजिकल टुकड़ों में समस्या को तोड़ने के लिए एक या अधिक नेस्टेड फ़ंक्शंस को भरोसा करके कुछ जटिल तर्क लागू करता है।
  2. वे कुछ मामलों में गुजरने वाले पैरामीटर को सरल बनाते हैं। एक नेस्टेड फ़ंक्शन में बाहरी पैरामीटर के दायरे में सभी पैरामीटर और कुछ या सभी चरों तक पहुंच होती है, इसलिए बाहरी फ़ंक्शन को स्थानीय स्थिति के ढेर को नेस्टेड फ़ंक्शन में स्पष्ट रूप से पास नहीं करना पड़ता है।
13

नहीं, C में कोई नेस्टेड फ़ंक्शन नहीं हो सकता है। आप निकटतम आ सकते हैं किसी अन्य समारोह की परिभाषा के अंदर एक समारोह घोषित करना। हालांकि, उस फ़ंक्शन की परिभाषा किसी अन्य फ़ंक्शन बॉडी के बाहर दिखाई देनी है।

उदा।

void f(void) 
{ 
    // Declare a function called g 
    void g(void); 

    // Call g 
    g(); 
} 

// Definition of g 
void g(void) 
{ 
} 
+3

यदि फ़ंक्शन जी को इस तरह घोषित किया गया है, तो इसका दायरा क्या होगा? –

+4

घोषणा किसी भी अन्य घोषणा की तरह स्कॉप्ड की गई है, इसलिए इस मामले में फ़ंक्शन के अंत तक। निश्चित रूप से फ़ाइल में बाद में 'जी' की परिभाषा दिखाई दे रही है कि घोषणा शेष शेष इकाई के लिए दायरे में है। इसके अलावा आप दायरे में एक स्पष्ट घोषणा के बिना ccan में कॉल कर सकते हैं भले ही यह सलाह नहीं दी जाती है। –

12

नेस्टेड कार्यों एएनएसआई सी, तथापि, they are part ofGNU सी का हिस्सा नहीं हैं।

+0

यदि वे जीएनयू सी –

+0

@ साचिन का हिस्सा हैं, तो यह समझने में सहायता क्या है कि नेस्टेड कार्यों वाले सी कोड को जीसीसी के साथ क्यों संकलित किया जा सकता है। जानकारी शैक्षणिक मूल्य है। इसके अलावा, सवाल यह निर्दिष्ट नहीं करता है कि यह केवल C89, C99 या GNU C – zoli2k

+3

तक सीमित है, जीसीसी द्वारा समर्थित अन्य भाषाओं में उन्हें (एडीए और पास्कल जो मुझे पता है) है, इसलिए यह संभव है कि या तो जोड़ना आसान हो सी कार्यान्वयन के लिए या यह उन भाषाओं को समर्थन देने के लिए सी में जोड़ा गया था, जिनकी आवश्यकता होती है। – nategoose

2

जैसा कि अन्य ने उत्तर दिया है, मानक सी नेस्टेड कार्यों का समर्थन नहीं करता है।

किसी भी कंटेनर (बाहरी कार्य) में एकाधिक कार्यों और चर को संलग्न करने के लिए कुछ भाषाओं में नेस्टेड फ़ंक्शंस का उपयोग किया जाता है ताकि व्यक्तिगत कार्य (बाहरी कार्य को छोड़कर) और चर बाहर से नहीं देखे जा सकें।

सी में, यह इस तरह के कार्यों को एक अलग स्रोत फ़ाइल में डालकर किया जा सकता है। मुख्य कार्य को वैश्विक और अन्य सभी कार्यों और चर के रूप में स्थिर के रूप में परिभाषित करें। अब इस मॉड्यूल के बाहर केवल मुख्य कार्य दिखाई देता है।

+0

यदि रिकर्सन 'बाहरी'->' नेस्टेड'-> 'बाहरी'->' नेस्टेड 'है, तो वहां' int घोषित_इन_उटर 'रखने वाले दो अलग-अलग फ्रेम होंगे, इसलिए आप केवल 'घोषित_इन_उटर' को स्थिर के रूप में नहीं डाल सकते वैश्विक। –

3

मैं इसका उल्लेख करता हूं क्योंकि सी में कोडिंग करने वाले बहुत से लोग अब सी ++ कंपाइलर्स (जैसे विजुअल सी ++ और कील यूविजन) का उपयोग कर रहे हैं, ताकि आप इसका उपयोग कर सकें ...

हालांकि अभी तक सी में नहीं की अनुमति दी है, तो आप सी ++ का उपयोग कर रहे हैं, तो आप में पेश लैम्ब्डा कार्यों के साथ एक ही प्रभाव सी ++ 11 प्राप्त कर सकते हैं:

void f() 
{ 
    auto g = []() { /* Some functionality */ } 

    g(); 
} 
+2

प्रश्न विशेष रूप से सी के बारे में था, सी ++ – Virgile

+2

@Virgile नहीं - और सवाल यह भी विशेष रूप से कहा गया है "क्या किसी अन्य भाषा में नेस्टेड फ़ंक्शंस की अनुमति है?"। जॉन के जवाब ने मेरी मदद की। – user1863152

-1

सी में एक नेस्टेड समारोह यह नहीं है ? (फ़ंक्शन डिस्प्ले अकाउंट्स())

मुझे पता है कि मैं फ़ंक्शन को अलग-अलग परिभाषित कर सकता हूं और चर पारित कर सकता हूं और क्या कोई भी अच्छी तरह से काम नहीं करता क्योंकि मुझे कई बार खातों को मुद्रित करने की आवश्यकता होती है।

(snipet एक स्कूल असाइनमेंट से लिया गया) ...

//function 'main' that executes the program. 
int main(void) 
{ 
    int customerArray[3][3] = {{1, 1000, 600}, {2, 5000, 2500}, {3, 10000, 2000}}; //multidimensional customer data array. 
    int x, y;  //counters for the multidimensional customer array. 
    char inquiry; //variable used to store input from user ('y' or 'n' response on whether or not a recession is present). 

    //function 'displayAccounts' displays the current status of accounts when called. 
    void displayAccounts(void) 
    { 
     puts("\t\tBank Of Despair\n\nCustomer List:\n--------------"); 
     puts("Account # Credit Limit\t Balance\n--------- ------------\t -------"); 
     for(x = 0; x <= 2; x++) 
     { 
      for(y = 0; y <= 2; y++) 
       printf("%9d\t", customerArray[x][y]); 
      puts("\n"); 
     } 
    } 

    displayAccounts(); //prints accounts to console. 
    printf("Is there currently a recession (y or n)? "); 


//... 

    return 0; 
} 
+3

यह कानूनी मानक सी नहीं है। यदि यह आपके कंपाइलर के साथ काम करता है, तो ऐसा इसलिए है क्योंकि आपके कंपाइलर ने मानक सी भाषा में विस्तार प्रदान किया है; कुछ अर्थ में आपका कंपाइलर एक अलग भाषा संकलित कर रहा है, जो सख्ती से बोल रहा है, सी –

+0

आपके इनपुट के लिए धन्यवाद।मैंने बाद में कार्यों को घोषित करने, परिभाषित करने और उपयोग करने का उचित तरीका सीखा है। यह वापस देखने के लिए थोड़ा शर्मनाक है>< – midnightCoder

1

अपने दूसरे सवाल का जवाब करने के लिए, जिन भाषाओं में नेस्टेड कार्यों को परिभाषित करने की अनुमति देते हैं (एक सूची यहां पाया जा सकता: nested-functions-language-list-wikipedia)।

जावास्क्रिप्ट है, जो उन भाषाओं के सबसे प्रसिद्ध में से एक है में, नेस्टेड कार्य (जो बंद कहा जाता है) के कुछ ऐसे उपयोग कर रहे हैं:

  • वस्तुओं के निर्माताओं में वर्ग तरीकों बनाने के लिए।
  • सेटर्स और गेटर्स के साथ निजी वर्ग के सदस्यों की कार्यक्षमता को प्राप्त करने के लिए।
  • वैश्विक नेमस्पेस को प्रदूषित नहीं करना (जो निश्चित रूप से हर भाषा के लिए जाता है)।

कुछ नाम हैं ...