ในบางแอปพลิเคชัน เราพบว่ามีการประกาศฟังก์ชันบางอย่างภายในฟังก์ชันอื่น บางครั้งเรียกว่าฟังก์ชันที่ซ้อนกัน แต่จริงๆ แล้ว นี่ไม่ใช่ฟังก์ชันที่ซ้อนกัน สิ่งนี้เรียกว่าการกำหนดขอบเขตคำศัพท์ การกำหนดขอบเขตคำศัพท์ไม่ถูกต้องใน 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