C मानक में नेस्टेड फंक्शन्स (एक फंक्शन के अंदर दूसरा फंक्शन परिभाषित करना) समर्थित नहीं हैं। इसे लेक्सिकल स्कोपिंग कहते हैं, लेकिन C कंपाइलर आंतरिक फंक्शन की सही मेमोरी लोकेशन तक नहीं पहुंच पाता।
समस्या
#include <stdio.h>
int main(void) {
printf("Main Function");
int my_fun() {
printf("my_fun function");
int my_fun2() { // नेस्टेड फंक्शन
printf("my_fun2 is inner function");
}
}
my_fun2(); // एरर: undefined reference to 'my_fun2'
return 0;
}
आउटपुट (एरर)
text.c:(.text+0x1a): undefined reference to `my_fun2'
GNU C एक्सटेंशन (non-standard)
GCC कंपाइलर auto कीवर्ड के साथ नेस्टेड फंक्शन घोषणा की अनुमति देता है (केवल GNU एक्सटेंशन के रूप में)।
#include <stdio.h>
int main(void) {
auto int my_fun(); // फॉरवर्ड डिक्लेरेशन
my_fun();
printf("Main Function\n");
int my_fun() { // डेफिनिशन
printf("my_fun function\n");
}
printf("Done");
return 0;
}
आउटपुट
my_fun function Main Function Done
महत्वपूर्ण बिंदु
- स्टैंडर्ड C (C99, C11, C18) में नेस्टेड फंक्शन्स अवैध हैं।
- GCC का
autoएक्सटेंशन पोर्टेबल नहीं है। - नेस्टेड फंक्शन्स केवल ग्लोबल वेरिएबल्स एक्सेस कर सकते हैं, बाहरी फंक्शन के लोकल वेरिएबल्स नहीं।
- विकल्प: फंक्शन पॉइंटर्स, स्ट्रक्चर्स में फंक्शन पॉइंटर्स, या अलग फंक्शन्स उपयोग करें।