先來囉嗦幾句,身邊的朋友,同事都喜歡在博客上記錄本身在學習計算機編程技術路程上的一些問題和心得。就我我的而言,這是個好習慣,特別是在計算機編程領域,技術方向種類繁多,永無止境。因此,我也開始我人生中第一份博客,但願看到的朋友多多鼓勵和討論,在此謝過。對於計算技術,越是深刻越越數學掛鉤,想達到大神級別,嗯,我是有自知之明的。計算機技術雖然之多,並不須要咱們每個領域每一項技術都特別的精通。固然,能作到,我由衷的佩服和羨慕,只要咱們專一於某些技術領域並能達到「精通」兩個字就已經很不容易,畢竟精神和身體耗損太大,通常人難以達到一應俱全。我的特別喜歡C語言,用其研發已有6年多的時間,一直很熱衷。下面就由讀者和我一塊兒來看看使用C語言實現Lambda表達式(gcc編譯器)。編程
「Lambda 表達式」(Lambda Expression)是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式能夠表示閉包(注意和數學傳統意義上的不一樣)。服務器
C語言實現Lambda表達式,通常來講都是經過宏定義來的,這樣就可使用相似Lambda(...)這樣形式,請看下面:網絡
#define cgs_lambda( return_type, function_body) \閉包
({return_type cgs_lambda_func function_body cgs_lambda_func;})框架
上述,就是Lambda表達式的宏定義,「cgs_」前綴是我在本身的項目中使用的,不是重點。重點在於( return_type, function_body)使用在({return_type cgs_lambda_func function_body cgs_lambda_func;})語句,return_type爲返回類型,function_body爲Lambda表達式中匿名函數的函數體。注意,中間cgs_lambda_func其實就是匿名的函數名,最後的cgs_lambda_func的做用表示函數的地址就定義在此,如何使用cgs_lambda表達式,咱們經過一個簡單的實例作進一步分析。函數
完整代碼以下:學習
#include <stdio.h>測試
/** 這裏是咱們定義的Lambda表達式的宏定義 */翻譯
#define cgs_lambda( return_type, function_body) \作用域
({return_type cgs_lambda_func function_body cgs_lambda_func;})
/*************************** 測試Main **************************/
int main( int argc, const char **argv)
{
/** 咱們作兩個數相加的操做 */
printf( "Sum = %d\n", cgs_lambda( int, (int x, int y){ return x + y; })(3, 4) );
return 0;
}
能夠經過編譯和運行試試,運行結果爲:Sum = 7
好了,咱們來說解一下,return_type爲int型,function_body爲帶兩個入參的函數體(int x, int y){ return x + y; },後面的(3, 4)就是咱們調用cgs_lambda_func傳的入參。這樣應該知道cgs_lambda表達式中最有一個「cgs_lambda_func;」的做用了,別忘了末尾的分號「;",不然編譯不過去的。
咱們來翻譯上述咱們示例中的cgs_lambda表達式編譯事後是什麼樣子,以下:
({int cgs_lambda_func (int x, int y){ return x + y; } cgs_lambda_func;})(3, 4)
簡單剖析,「函數聲明--->當即傳參調用」,代碼塊由「({」和「})」括住,其實做用域也就是僅限於「({」和「})」之間,達到局部的做用。引入訪問外部變量的例子:
#include <stdio.h>
/** 這裏是咱們定義的Lambda表達式的宏定義 */
#define cgs_lambda( return_type, function_body) \
({return_type cgs_lambda_func function_body cgs_lambda_func;})
/*************************** 測試Main **************************/
int main( int argc, const char **argv)
{
int a = 1;
/** 咱們作兩個數相加的操做 */
printf( "Sum = %d\n", cgs_lambda( int, (int x, int y){ a++; return x + y; })(a, 4) );
printf( "a = %d\n", a);
return 0;
}
很是感謝讀者的耐心細讀,我會慢慢更新個人博客,也會作好個人博客,最近本身在忙於寫網絡服務器方面的小型框架,謝謝您的關注,祝您身體健康,萬事如意。