A Blocks ( eng. blocks ) a C , C++ , Objective-C programozási nyelvek kiterjesztése , amelyet ezeknek a nyelveknek a szabványai nem írnak le, és az Apple készítette . A kiterjesztés lehetővé teszi lezárások létrehozását lambda - szerű szintaxis használatával.
A "blokkokat" azért hozták létre, hogy megkönnyítsék az alkalmazások írását a Grand Central Dispatch [1] [2] platformra, de más platformokon is használhatók. Az Apple "blokkokat" valósított meg a GCC fordítóprogram saját ágában . Az LLVM fordítók számára létrehoztak egy futásidejű könyvtárat .
A "blokkok" olyanok, mint a függvények :
A függvényekkel ellentétben:
A blokkokkal való munkához a fordító további kódot generál. A program végrehajtása során ez a kód minden egyes létrehozott blokkhoz rejtett objektumot hoz létre. Az objektum a következő mezőket tartalmazza:
Ahhoz, hogy a fordító megmondja, hogy egy "blokk" címe (nem pedig egy normál függvény) egy változóban kerül tárolásra, egy speciális kulcsszót kell használni. A kulcsszó nem kötelező, ha a "blokk" és a változó ugyanabban a hatókörben van .
A következő példában [3] a függvény létrehoz egy blokkot, és visszaadja a mutatót. MakeCounter
#include <stdio.h> #include <Block.h> // álnév létrehozása a pointer-to-block típushoz typedef int ( ^ IntBlock ) (); IntBlock MakeCounter ( int start , int increment ) { __block int i = start ; return Block_copy ( ^ { int ret = i ; i += növekmény ; return ret ; } ); } int main () { IntBlock my_counter = MakeCounter ( 5 , 2 ); printf ( "Első hívás: %d \n " , my_counter () ); printf ( "Második hívás: %d \n " , my_counter () ); printf ( "Harmadik hívás: %d \n " , my_counter () ); // felszabadítja a blokk létrehozásakor lefoglalt memóriát a rejtett objektum tárolására Block_release ( my_counter ); return 0 ; }A program a következőket nyomtatja ki.
Első hívás: 5 Második hívás: 7 Harmadik hívás: 9A parancs a példának a clang fordítóval történő fordításához a következő:
clang -fblocks blocks-test.c -lBlocksRuntime