塊(C語言擴展)

本詞條是多義詞,共3個義項
更多義項 ▼ 收起列表 ▲

塊(blocks)是由LLVM提出的類似於lambda表達式的非標準C語言擴展,亦可以套用於Objective-C與C++中。它的語法類似於這些函式中的閉包,即由大括弧包括的語句塊。蘋果設計塊的一個目的是使設計基於Grand Central Dispatch執行緒結構的程式更容易,但塊是獨立於這一構架的,它也可以在其它程式中以與普通語句塊十分相似的方式套用。蘋果已經在蘋果修改版的GCC編譯器以及Clang LLVM編譯器前端中實現了這一特性;同時,LLVM計畫,包括了支持塊特性的運行時庫。與函式定義類似,塊可以有參數,也可以在其內部聲明私有變數。與普通的C函式定義不同,塊可以使用其上文中定義的變數。一個塊定義會產生一個不透明的值,該值同時包括了塊內代碼的引用和定義時棧內局部變數的快照(而非調用時)。塊可以在定義後被調用,其行為與函式指針相同。塊可以如同函式指針一般被賦值到變數中,作為函式的參數傳遞,但若塊需要在其被定義的範圍之外被使用時,程式設計師(或API)需要將該塊用特別的運算符(Block_copy)標記。在定義塊之後,塊內的代碼可以在任何時間被調用,語法與調用函式相同。

基本介紹

  • 中文名:塊
  • 外文名:blocks
  • 提出者:LLVM
  • 示例:#include<stdio.h>
  • 類似:lambda表達式
示例,編譯,與GCC嵌套函式的關係,C語言標準,

示例

一個簡單的計數器的例子:
#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*/

編譯

Linux:
clang-fblocksblocks-test.c-lBlocksRuntime

與GCC嵌套函式的關係

塊在外表上與GCC的C擴展語句塊內的嵌套函式相似。然而,嵌套函式與塊不同,在退出當前語句塊後就不能被調用了。

C語言標準

塊特性已經被提交到C標準委員會,作為C1x標準的一系列提案。

相關詞條

熱門詞條

聯絡我們