Blocks ( angl. Blocks ) je rozšířením programovacích jazyků C , C++ , Objective-C , které není popsáno ve standardech těchto jazyků a je vytvořeno společností Apple . Rozšíření umožňuje vytvářet uzávěry pomocí syntaxe podobné lambda .
„Bloky“ byly vytvořeny, aby usnadnily psaní aplikací pro platformu Grand Central Dispatch [1] [2] , ale lze je použít i na jiných platformách. Apple implementoval „bloky“ do své vlastní větve kompilátoru GCC . Pro kompilátory LLVM byla vytvořena runtime knihovna .
"Bloky" jsou jako funkce :
Na rozdíl od funkcí:
Pro práci s bloky kompilátor generuje další kód. Během provádění programu vytvoří tento kód pro každý vytvořený blok skrytý objekt. Objekt obsahuje následující pole:
Chcete-li kompilátoru říci, že adresa "bloku" (spíše než běžné funkce) bude uložena v proměnné, je třeba použít speciální klíčové slovo. Klíčové slovo není povinné, pokud jsou "blok" a proměnná ve stejném rozsahu .
V následujícím příkladu [3] funkce vytvoří blok a vrátí na něj ukazatel. MakeCounter
#include <stdio.h> #include <Block.h> // vytvoření aliasu pro typ ukazatele na blok typedef int ( ^ IntBlock ) (); IntBlock MakeCounter ( int start , int increment ) { __block int i = start ; return Block_copy ( ^ { int ret = i ; i += přírůstek ; vrátit ret ; } ); } int main () { IntBlock my_counter = MakeCounter ( 5 , 2 ); printf ( "První volání: %d \n " , moje_počítadlo () ); printf ( "Druhé volání: %d \n " , moje_počítadlo () ); printf ( "Třetí volání: %d \n " , moje_počítadlo () ); // uvolnění paměti přidělené při vytváření bloku pro uložení skrytého objektu Block_release ( my_counter ); návrat 0 ; }Program vytiskne následující.
První hovor: 5 Druhý hovor: 7 Třetí hovor: 9Příkaz pro kompilaci příkladu pomocí kompilátoru clang je:
clang -fblocks blocks-test.c -lBlocksRuntime