क्या हम सी में एक नेस्टेड फ़ंक्शन कर सकते हैं? नेस्टेड फ़ंक्शन का उपयोग क्या है? यदि वे C में मौजूद हैं, तो उनका कार्यान्वयन कंपाइलर से संकलक में भिन्न होता है?
क्या हम सी में एक नेस्टेड फ़ंक्शन कर सकते हैं? नेस्टेड फ़ंक्शन का उपयोग क्या है? यदि वे C में मौजूद हैं, तो उनका कार्यान्वयन कंपाइलर से संकलक में भिन्न होता है?
जवाबों:
आप मानक C में किसी फ़ंक्शन को परिभाषित नहीं कर सकते।
आप किसी फ़ंक्शन के अंदर फ़ंक्शन की घोषणा कर सकते हैं , लेकिन यह एक नेस्टेड फ़ंक्शन नहीं है।
gcc में एक भाषा एक्सटेंशन है जो नेस्टेड फ़ंक्शन को अनुमति देता है । वे गैर-मानक हैं, और जैसे पूरी तरह से संकलक पर निर्भर हैं।
नहीं, वे C में मौजूद नहीं हैं।
उनका उपयोग पास्कल जैसी भाषाओं में (कम से कम) दो कारणों से किया जाता है:
नेस्टेड फ़ंक्शन ANSI C का हिस्सा नहीं हैं , हालांकि, वे Gnu C का हिस्सा हैं ।
नहीं, आपके पास एक नेस्टेड फ़ंक्शन नहीं हो सकता है C
। आप जितने करीब आ सकते हैं, एक फ़ंक्शन को दूसरे फ़ंक्शन की परिभाषा के अंदर घोषित करना है। उस फ़ंक्शन की परिभाषा को किसी अन्य फ़ंक्शन बॉडी के बाहर दिखाई देना है, हालांकि।
उदाहरण के लिए
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
फ़ाइल में परिभाषा बाद में दिखाई देती है कि घोषणा बाकी अनुवाद इकाई के लिए गुंजाइश है। इसके अलावा, यदि आप सी में फ़ंक्शन को दृश्यमान घोषणा के बिना भी कॉल कर सकते हैं, भले ही यह उचित न हो।
मैं इसका उल्लेख करता हूं कि C में कोडिंग करने वाले कई लोग अब इसे करने के लिए C ++ कंपाइलर (जैसे Visual C ++ और Keil uVision) का उपयोग कर रहे हैं, इसलिए आप इसका उपयोग करने में सक्षम हो सकते हैं ...
यद्यपि C में अभी तक अनुमति नहीं है, यदि आप C ++ का उपयोग कर रहे हैं, तो आप C ++ 11 में शुरू किए गए लंबो कार्यों के साथ समान प्रभाव प्राप्त कर सकते हैं:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
जैसा कि दूसरों ने उत्तर दिया है, मानक सी नेस्टेड कार्यों का समर्थन नहीं करता है।
नेस्टेड फ़ंक्शंस का उपयोग कुछ भाषाओं में कई फ़ंक्शंस और वेरिएबल्स को एक कंटेनर (बाहरी फ़ंक्शन) में संलग्न करने के लिए किया जाता है ताकि व्यक्तिगत फ़ंक्शंस (बाहरी फ़ंक्शन को छोड़कर) और वेरिएबल्स को बाहर से नहीं देखा जा सके।
में सी , यह एक अलग स्रोत फ़ाइल में इस तरह के कार्यों रख कर किया जा सकता है। वैश्विक और अन्य सभी कार्यों और चर के रूप में मुख्य फ़ंक्शन को स्थिर के रूप में परिभाषित करें । अब इस मॉड्यूल के बाहर केवल मुख्य फ़ंक्शन दिखाई देता है।
outer
-> nested
-> outer
-> nested
, तो दो अलग-अलग फ्रेम पकड़े होंगे int declared_in_outer
, इसलिए आप केवल declared_in_outer
एक स्थिर वैश्विक के रूप में नहीं डाल सकते ।
आपके दूसरे प्रश्न का उत्तर देने के लिए, ऐसी भाषाएँ हैं जो नेस्टेड फ़ंक्शंस को परिभाषित करने की अनुमति देती हैं (एक सूची यहां पाई जा सकती है: नेस्टेड-फ़ंक्शंस-भाषा-सूची-विकिपीडिया )।
जावास्क्रिप्ट में, जो उन भाषाओं में सबसे प्रसिद्ध है, एक नेस्टेड फ़ंक्शन (जिसे क्लोज़र कहा जाता है) में से एक हो सकते हैं:
कुछ नाम है...
या आप इसके बारे में होशियार हो सकते हैं और अपने लाभ में प्रीप्रोसेसर का उपयोग कर सकते हैं ( 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
क्या यह 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;
}