ในบางแอปพลิเคชันอาจเห็นว่ามีฟังก์ชันประกาศอยู่ภายในอีกฟังก์ชันหนึ่ง เรื่องนี้บางครั้งเรียกว่า Nested Function แต่จริงๆ แล้วใน C มันไม่ใช่ Nested Function จริงๆ เรียกว่า Lexical Scoping ซึ่ง C ไม่รองรับเพราะคอมไพเลอร์ไม่สามารถเข้าถึงตำแหน่งหน่วยความจำที่ถูกต้องของฟังก์ชันภายในได้
ฟังก์ชันซ้อนไม่สามารถเข้าถึงตัวแปรท้องถิ่นของบล็อกรอบข้างได้ สามารถเข้าถึงได้เฉพาะตัวแปรกล로บอล ใน C มี 2 ขอบเขต (scope) คือ local และ global ดังนั้นฟังก์ชันซ้อนจึงมีการใช้งานจำกัด หากพยายามสร้างฟังก์ชันซ้อนแบบนี้จะเกิดข้อผิดพลาด
ตัวอย่างที่ทำงานไม่ได้
#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(); // Error: undefined reference to 'my_fun2'
}
ข้อผิดพลาด
text.c:(.text+0x1a): undefined reference to `my_fun2'
อย่างไรก็ตาม GNU C Compiler มีส่วนขยาย (extension) อนุญาตให้ประกาศฟังก์ชันซ้อนได้ โดยใช้คีย์เวิร์ด auto ก่อนการประกาศ
ตัวอย่างที่ทำงานได้ (GNU C Extension)
#include <stdio.h>
int main(void) {
auto int my_fun();
my_fun();
printf("Main Function\n");
return 0;
}
int my_fun() {
printf("my_fun function\n");
return 0;
}
ผลลัพธ์
my_fun function Main Function