Hàm xếp trong
nested function
hay hàm cục bộlocal function
không phải là một tính năng trong cấu hình tiêu chuẩn của ngôn ngữC
mà chỉ được hỗ trợ đặc biệt bởi trình biên dịchGCC
.
Định nghĩa hàm cục bộ
Code ví dụ định nghĩa hàm add
trong phạm vi cục bộ của main
.
#include <stdio.h> void main (int $argc, char* $argv[]) { int add (int $x, int $y) { return $x + $y; } printf ("Total: %d \n", add (1, 2));
}
Kết quả:
Total: 3
Giống với hàm cục bộ của các ngôn ngữ khác ví dụ như
JS
, hàm cục bộ doGCC
hỗ trợ có thể truy xuất tới các biến cục bộ củamain
và có thể được sử dụng làm kết quả trả về hay truyền vào một hàm khác ở dạng hàm gọi lạicallback
.
Biểu thức hàm vô danh
Biểu thức hàm
lambda expression
không có mặt trong cấu hình tiêu chuẩn của ngôn ngữC
mà chỉ được trình biên dịchGCC
hỗ trợ mở rộng.
Trong code ví dụ ở phần trước, phần code định nghĩa hàm cục bộ add
thực ra đã làm hai thao tác:
- Khai báo một con trỏ hàm
int (*add) (int, int)
trong phạm vi cục bộ củamain
. - Khởi tạo một hàm vô danh và gán địa chỉ vào con trỏ
add
.
#include <stdio.h> void main (int $argc, char* $argv[]) { int (*add) (int, int) = ({ int __fn__ (int $x, int $y) { return $x + $y; } __fn__; }); printf ("Total: %d \n", add (1, 2));
}
So với code định nghĩa
nested function
, biểu thứclambda
là một phần của câu lệnh đơnstatement;
.