-
塊
(C語言擴展)
鎖定
塊(blocks)是由LLVM提出的類似於lambda表達式的非標準C語言擴展,亦可以應用於Objective-C與C++中。它的語法類似於這些函數中的閉包,即由大括號包括的語句塊。蘋果設計塊的一個目的是使設計基於Grand Central Dispatch線程結構的程序更容易
[1]
,但塊是獨立於這一構架的,它也可以在其它程序中以與普通語句塊十分相似的方式應用。蘋果已經在蘋果修改版的GCC編譯器以及Clang LLVM編譯器前端中實現了這一特性;同時,LLVM計劃,包括了支持塊特性的運行時庫。與函數定義類似,塊可以有參數,也可以在其內部聲明私有變量。與普通的C函數定義不同,塊可以使用其上文中定義的變量。一個塊定義會產生一個不透明的值,該值同時包括了塊內代碼的引用和定義時棧內局部變量的快照(而非調用時)。塊可以在定義後被調用,其行為與函數指針相同。塊可以如同函數指針一般被賦值到變量中,作為函數的參數傳遞,但若塊需要在其被定義的範圍之外被使用時,程序員(或API)需要將該塊用特別的運算符(Block_copy)標記。在定義塊之後,塊內的代碼可以在任何時間被調用,語法與調用函數相同。
- 中文名
- 塊
- 外文名
- blocks
- 提出者
- LLVM
- 示 例
- #include<stdio.h>
- 類 似
- lambda表達式
目錄
- 1 示例
- 2 編譯
- 3 與GCC嵌套函數的關係
- 4 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:5 Secondcall:7 Thirdcall:9 */
塊編譯
Linux:
clang-fblocksblocks-test.c-lBlocksRuntime
塊與GCC嵌套函數的關係
塊C語言標準
- 參考資料
-
- 1. Mac OS X 10.6 Snow Leopard: the Ars Technica review: Blocks .arstechnica.com.2009-09-01[引用日期2014-04-16]
- 2. Nested Functions: Using the GNU Compiler Collection (GCC). .GUN[引用日期2014-04-16]
- 3. BLOCKS PROPOSAL, N1451 .open-std[引用日期2014-04-16]
- 4. APPLE’S EXTENSIONS TO C, N1451 .open-std[引用日期2014-04-16]
- 詞條統計
-
- 瀏覽次數:次
- 編輯次數:7次歷史版本
- 最近更新: 435085255