Lambda 表達式(Lambda Expression)源自 λ 演算,指**匿名函數**:無需命名即可定義、傳遞、調用的函數對象,可捕獲外部作用域變量形成閉包。C++11、Java 8、Python 等現代語言均原生支持。
GCC 提供**語句表達式**(Statement Expressions)擴展:({ ... }),允許在表達式位置寫入複合語句,最後一條語句的值作為整個表達式的值。結合嵌套函數(Nested Functions)擴展,即可在函數內部定義函數,並訪問外部局部變量。
#define cgs_lambda(return_type, function_body) \
({ return_type cgs_lambda_func function_body cgs_lambda_func; })
return_type:返回類型(如 int)。function_body:函數體,包含參數列表與花括號,如 (int x, int y) { return x + y; }。cgs_lambda_func:內部生成的匿名函數名(實為編譯器分配的唯一標識)。cgs_lambda_func,可直接調用。#include#define cgs_lambda(return_type, function_body) \ ({ return_type cgs_lambda_func function_body cgs_lambda_func; }) int main() { // 定義並調用匿名加法函數 printf("Sum = %d\n", cgs_lambda(int, (int x, int y) { return x + y; })(3, 4)); // 輸出:Sum = 7 return 0; }
({
int cgs_lambda_func(int x, int y) { return x + y; }
cgs_lambda_func; // 表達式值為函數指針
})(3, 4)
GCC 嵌套函數自動捕獲外部作用域的局部變量(按引用):
int multiplier = 10;
auto fn = cgs_lambda(int, (int x) { return x * multiplier; });
printf("%d\n", fn(5)); // 輸出 50
multiplier = 2;
printf("%d\n", fn(5)); // 輸出 10(捕獲引用,見證外部變量變化)
| 方案 | 原理 | 優點 | 缺點 |
|---|---|---|---|
| 函數指針 + void* 上下文 | 手動傳遞上下文結構體 | 標準 C、可移植、生命週期可控 | 樣板代碼多、無語法糖 |
| GCC Blocks (Apple 擴展) | ^return_type(params) { ... } | 語法優雅、支持複製到堆 | 僅限 Apple 平台/Clang |
C++11 std::function | 原生 Lambda | 功能完整、標準化 | 需 C++ 編譯器 |