Blocks ( eng. blocks ) är en förlängning av programmeringsspråken C , C++ , Objective-C , inte beskrivna i standarderna för dessa språk och skapade av Apple . Tillägget låter dig skapa stängningar med en lambda - liknande syntax.
"Block" skapades för att göra det lättare att skriva applikationer för Grand Central Dispatch [1] [2] -plattformen, men kan användas på andra plattformar också. Apple har implementerat "block" i sin egen gren av GCC- kompilatorn . Ett körtidsbibliotek har skapats för LLVM - kompilatorer .
"Block" är som funktioner :
Till skillnad från funktioner:
För att arbeta med block genererar kompilatorn ytterligare kod. Under programexekveringen, för varje skapat block, skapar denna kod ett dolt objekt. Objektet innehåller följande fält:
För att tala om för kompilatorn att adressen till ett "block" (snarare än en vanlig funktion) kommer att lagras i en variabel, bör ett speciellt nyckelord användas. Nyckelordet krävs inte om "blocket" och variabeln är inom samma omfång .
I följande exempel [3] skapar funktionen ett block och returnerar en pekare till det. MakeCounter
#include <stdio.h> #include <Block.h> // skapa ett alias för pekare-till-block-typen typedef int ( ^ IntBlock ) (); IntBlock MakeCounter ( int start , int inkrement ) { __block int i = start ; returnera Block_copy ( ^ { int ret = i ; i += ökar ; return ret ; } ); } int main () { IntBlock my_counter = MakeCounter ( 5 , 2 ); printf ( "Första samtal: %d \n " , min_räknare () ); printf ( "Andra anrop: %d \n " , min_räknare () ); printf ( "Tredje anrop: %d \n " , min_räknare () ); // släpp minnet som tilldelats när du skapar blocket för att lagra det dolda objektet Block_release ( my_counter ); returnera 0 ; }Programmet kommer att skriva ut följande.
Första samtalet: 5 Andra samtalet: 7 Tredje samtalet: 9Kommandot för att kompilera exemplet med clang- kompilatorn är:
clang -fblocks blocks-test.c -lBlocksRuntime