塊(blocks)是由LLVM提出的類似於lambda表達式的非標準C語言擴展,亦可以套用於Objective-C與C++中。它的語法類似於這些函式中的閉包,即由大括弧包括的語句塊。蘋果設計塊的一個目的是使設計基於Grand Central Dispatch執行緒結構的程式更容易,但塊是獨立於這一構架的,它也可以在其它程式中以與普通語句塊十分相似的方式套用。蘋果已經在蘋果修改版的GCC編譯器以及Clang LLVM編譯器前端中實現了這一特性;同時,LLVM計畫,包括了支持塊特性的運行時庫。與函式定義類似,塊可以有參數,也可以在其內部聲明私有變數。與普通的C函式定義不同,塊可以使用其上文中定義的變數。一個塊定義會產生一個不透明的值,該值同時包括了塊內代碼的引用和定義時棧內局部變數的快照(而非調用時)。塊可以在定義後被調用,其行為與函式指針相同。塊可以如同函式指針一般被賦值到變數中,作為函式的參數傳遞,但若塊需要在其被定義的範圍之外被使用時,程式設計師(或API)需要將該塊用特別的運算符(Block_copy)標記。在定義塊之後,塊內的代碼可以在任何時間被調用,語法與調用函式相同。
基本介紹
- 中文名:塊
- 外文名:blocks
- 提出者:LLVM
- 示例:#include<stdio.h>
- 類似:lambda表達式
示例
#include<stdio.h>#include<Block.h>typedefint(^IntBlock)();IntBlockMakeCounter(intstart,intincrement){__blockinti=start;returnBlock_copy(^{intret=i;i+=increment;returnret;});}intmain(void){IntBlockmycounter=MakeCounter(5,2);printf("Firstcall:%d\n",mycounter());printf("Secondcall:%d\n",mycounter());printf("Thirdcall:%d\n",mycounter());/*由於是複製的塊,因此需要釋放*/Block_release(mycounter);return0;}/*Output:Firstcall:5Secondcall:7Thirdcall:9*/
編譯
clang-fblocksblocks-test.c-lBlocksRuntime