Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Hàm lồng nhau (Nested functions) trong C

Trong một số ứng dụng, ta thấy hàm được khai báo bên trong hàm khác. Điều này đôi khi gọi là hàm lồng nhau, nhưng thực tế đây không phải là hàm lồng nhau thực sự. Đó gọi là phạm vi từ vựng (lexical scoping). Phép lexical scoping không hợp lệ trong C tiêu chuẩn vì trình biên dịch không thể truy cập đúng vị trí bộ nhớ của hàm bên trong.

Định nghĩa hàm lồng nhau không thể truy cập biến cục bộ của khối bao quanh. Chúng chỉ truy cập được biến toàn cục. Trong C chỉ có hai phạm vi lồng nhau: cục bộ và toàn cục. Do đó hàm lồng nhau có ích hạn chế. Nếu thử tạo hàm lồng nhau như dưới đây, sẽ báo lỗi.

Ví dụ gây lỗi

#include <stdio.h>

int main(void) {
    printf("Main Function");
    int my_fun() {
        printf("my_fun function");
        // định nghĩa hàm khác bên trong hàm đầu tiên
        int my_fun2() {
            printf("my_fun2 is inner function");
        }
    }
    my_fun2(); // lỗi: my_fun2 không được nhìn thấy ở đây
    return 0;
}

Kết quả

text.c:(.text+0x1a): undefined reference to `my_fun2'

Tuy nhiê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. Cần thêm từ khóa auto trước khai báo hàm lồng nhau.

Ví dụ với GNU C (dùng 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");
        return 0;
    }
    printf("Done");
    return 0;
}

Kết quả

my_fun function
Main Function
Done