সি ভাষায় একটি ফাংশনের ভেতরে অন্য ফাংশন ডিক্লেয়ার করার চেষ্টা করলে সাধারণত কম্পাইলেশন এরর হয়। এটিকে অনেকসময় "নেস্টেড ফাংশন" বলে, কিন্তু আসলে এটি লেক্সিক্যাল স্কোপিং (Lexical Scoping)। সি কম্পাইলার ভেতরের ফাংশনের সঠিক মেমরি লোকেশন খুঁজে পায় না, তাই স্ট্যান্ডার্ড সি-তে এটি সাপোর্ট করে না।
নেস্টেড ফাংশনের সীমাবদ্ধতা
- বাহ্যিক ফাংশনের লোকাল ভেরিয়েবল অ্যাক্সেস করতে পারে না
- শুধু গ্লোবাল ভেরিয়েবল অ্যাক্সেস করতে পারে
- সি-তে কেবল দুই স্কোপ রয়েছে: লোকাল এবং গ্লোবাল
এরর উদাহরণ
#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'
}
আউটপুট (এরর)
text.c:(.text+0x1a): undefined reference to `my_fun2'
GNU C এক্সটেনশন: auto কীওয়ার্ড ব্যবহার
GNU C কম্পাইলার (GCC) নেস্টেড ফাংশন সাপোর্ট করে যদি বাহ্যিক ফাংশনে auto কীওয়ার্ড দিয়ে ফরওয়ার্ড ডিক্লেরেশন করা হয়।
উদাহরণ
#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
সারসংক্ষেপ
- স্ট্যান্ডার্ড সি (C89/C99/C11) নেস্টেড ফাংশন সাপোর্ট করে না
- GCC এক্সটেনশন হিসেবে
autoদিয়ে সাপোর্ট করে - পোর্টেবল কোড লিখতে হলে নেস্টেড ফাংশন এড়িয়ে চলা ভালো