Trong một số ứng dụng, chúng ta đã thấy rằng một số hàm được khai báo bên trong một hàm khác. Đây đôi khi được gọi là hàm lồng nhau, nhưng thực ra đây không phải là hàm lồng nhau. Đây được gọi là phạm vi từ vựng. Phạm vi từ vựng không hợp lệ trong C vì trình biên dịch không thể tiếp cận vị trí bộ nhớ chính xác của hàm bên trong.
Các định nghĩa hàm lồng nhau không thể truy cập các biến cục bộ của các khối xung quanh. Họ chỉ có thể truy cập các biến toàn cục. Trong C có hai phạm vi lồng nhau là cục bộ và toàn cục. Vì vậy, chức năng lồng nhau có một số hạn chế sử dụng. Nếu chúng ta muốn tạo hàm lồng nhau như bên dưới, nó sẽ tạo ra lỗi.
Ví dụ
#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(); }
Đầu ra
text.c:(.text+0x1a): undefined reference to `my_fun2'
Nhưng một phần mở rộng của trình biên dịch GNU C cho phép khai báo hàm lồng nhau. Đối với điều này, chúng ta phải thêm từ khóa auto trước khi khai báo hàm lồng nhau.
Ví dụ
#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"); }
Đầu ra
my_fun function Main Function Done