C語言實現匿名函數


在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;
});

當然這樣的代碼肯定是效率低下,而且多此一舉,這里只是簡單的舉個例子






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM