ในบางแอปพลิเคชัน เราพบว่ามีการประกาศฟังก์ชันบางอย่างภายในฟังก์ชันอื่น บางครั้งเรียกว่าฟังก์ชันที่ซ้อนกัน แต่จริงๆ แล้ว นี่ไม่ใช่ฟังก์ชันที่ซ้อนกัน สิ่งนี้เรียกว่าการกำหนดขอบเขตคำศัพท์ การกำหนดขอบเขตคำศัพท์ไม่ถูกต้องใน C เนื่องจากคอมไพเลอร์ไม่สามารถเข้าถึงตำแหน่งหน่วยความจำที่ถูกต้องของฟังก์ชันภายในได้
คำจำกัดความของฟังก์ชันที่ซ้อนกันไม่สามารถเข้าถึงตัวแปรในเครื่องของบล็อกรอบข้างได้ พวกเขาสามารถเข้าถึงตัวแปรส่วนกลางเท่านั้น ใน C มีขอบเขตซ้อนกันสองขอบเขตคือโลคัลและโกลบอล ฟังก์ชันที่ซ้อนกันจึงมีการใช้งานที่จำกัด หากเราต้องการสร้างฟังก์ชันที่ซ้อนกันดังด้านล่าง จะทำให้เกิดข้อผิดพลาด
ตัวอย่าง
#include <stdio.h>
main(void) {
printf("Main Function");
int my_fun() {
printf("my_fun function");
// defining another function inside the first function.
int my_fun2() {
printf("my_fun2 is inner function");
}
}
my_fun2();
} ผลลัพธ์
text.c:(.text+0x1a): undefined reference to `my_fun2'
แต่ส่วนขยายของคอมไพเลอร์ GNU C ช่วยให้สามารถประกาศฟังก์ชันที่ซ้อนกันได้ สำหรับสิ่งนี้เราต้องเพิ่มคำสำคัญอัตโนมัติก่อนการประกาศฟังก์ชั่นที่ซ้อนกัน
ตัวอย่าง
#include <stdio.h>
main(void) {
auto int my_fun();
my_fun();
printf("Main Function\n");
int my_fun() {
printf("my_fun function\n");
}
printf("Done");
} ผลลัพธ์
my_fun function Main Function Done