在C語言中可以通過宏定義的方式實現匿名函數,具體如下:
1
2
3
4
5
6
|
#define lambda(return_type, function_body) \
({ \
return_type $
this
function_body \
$
this
; \
})
#define $ lambda
|
該定義利用了GCC對C語言的擴展(被一對花括號包起來的代碼塊能夠返回一個值),該宏定義能夠返回$this(函數指針),如果我們需要一個返回兩整數的和的函數,那么我們還可以對該宏再做一次封裝,如下:
1
|
#define add2int(function_body) $(int, (int _a, int _b){function_body})
|
然后我們就可以像下面這樣來使用該宏(求一個整型數組所有元素的和):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
int
sum(
int
*arr,
int
length,
int
(*add)(
int
,
int
));
int
main(
int
argc,
char
**argv)
{
int
arr[] = { [0 ... 9] = 1, [10 ... 89] = 2, [90 ... 99] = 3 };
int
ret = sum(arr,
sizeof
(arr)/
sizeof
(
int
), add2int(
int
c = _a + _b;
return
c;));
//add2int返回一個求兩個整數和的函數
printf
(
"sum of arr is %d\n"
, ret);
}
int
sum(
int
*arr,
int
length,
int
(*add)(
int
,
int
))
{
int
sum = 0;
for
(
int
i=0; i < length; i++)
{
sum = add(sum, arr[i]);
}
return
sum;
}
|
當然也可以直接使用lambda宏,注意function_body需要包含函數的返回類型及參數列表,將上面第6行代碼替換為:
1
2
3
4
|
int
ret = sum(arr,
sizeof
(arr)/
sizeof
(
int
), $(
int
, (
int
_a,
int
_b){
int
c = _a + _b;
return
c;
});
|
當然這樣的代碼肯定是效率低下,而且多此一舉,這里只是簡單的舉個例子