सी में नेस्टेड फंक्शन


93

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


1
डुप्लिकेट होने लगता है: stackoverflow.com/questions/1348095/…
zoli2k

जवाबों:


108

आप मानक C में किसी फ़ंक्शन को परिभाषित नहीं कर सकते।

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

gcc में एक भाषा एक्सटेंशन है जो नेस्टेड फ़ंक्शन को अनुमति देता है । वे गैर-मानक हैं, और जैसे पूरी तरह से संकलक पर निर्भर हैं।


36

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

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

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

21

नेस्टेड फ़ंक्शन ANSI C का हिस्सा नहीं हैं , हालांकि, वे Gnu C का हिस्सा हैं


यदि वे गुन ग का हिस्सा हैं तो क्या महत्व है
सचिन चौरसिया

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

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

MATLAB में भी नेस्टेड फ़ंक्शन हैं।
mikeTronix

17

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

उदाहरण के लिए

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

    // Call g
    g();
}

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

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

6
घोषणा किसी भी अन्य घोषणा की तरह स्कोप की जाती है, इसलिए इस मामले में फ़ंक्शन के अंत तक। बेशक एक बार gफ़ाइल में परिभाषा बाद में दिखाई देती है कि घोषणा बाकी अनुवाद इकाई के लिए गुंजाइश है। इसके अलावा, यदि आप सी में फ़ंक्शन को दृश्यमान घोषणा के बिना भी कॉल कर सकते हैं, भले ही यह उचित न हो।
सीबी बेली

5

मैं इसका उल्लेख करता हूं कि C में कोडिंग करने वाले कई लोग अब इसे करने के लिए C ++ कंपाइलर (जैसे Visual C ++ और Keil uVision) का उपयोग कर रहे हैं, इसलिए आप इसका उपयोग करने में सक्षम हो सकते हैं ...

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

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

    g();
}

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

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

3

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

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

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


यदि पुनरावृत्ति होती है outer-> nested-> outer-> nested, तो दो अलग-अलग फ्रेम पकड़े होंगे int declared_in_outer, इसलिए आप केवल declared_in_outerएक स्थिर वैश्विक के रूप में नहीं डाल सकते ।
एड्रियन पनासीक

1

आपके दूसरे प्रश्न का उत्तर देने के लिए, ऐसी भाषाएँ हैं जो नेस्टेड फ़ंक्शंस को परिभाषित करने की अनुमति देती हैं (एक सूची यहां पाई जा सकती है: नेस्टेड-फ़ंक्शंस-भाषा-सूची-विकिपीडिया )।

जावास्क्रिप्ट में, जो उन भाषाओं में सबसे प्रसिद्ध है, एक नेस्टेड फ़ंक्शन (जिसे क्लोज़र कहा जाता है) में से एक हो सकते हैं:

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

कुछ नाम है...


0

या आप इसके बारे में होशियार हो सकते हैं और अपने लाभ में प्रीप्रोसेसर का उपयोग कर सकते हैं ( source.c):

#ifndef FIRSTPASS
#include <stdio.h>

//here comes your "nested" definitions
#define FIRSTPASS
#include "source.c"
#undef FIRSTPASS

main(){
#else
    int global = 2;
    int func() {printf("%d\n", global);}
#endif
#ifndef FIRSTPASS
    func();}
#endif

-1

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

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

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

//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;
}

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

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

1
@midnightCoder: आप हमेशा अपना उत्तर हटा सकते हैं :)
chrrlie
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.