Blocks ( eng. blocks ) er en udvidelse af programmeringssprogene C , C++ , Objective-C , ikke beskrevet i standarderne for disse sprog og skabt af Apple . Udvidelsen giver dig mulighed for at oprette lukninger ved hjælp af en lambda - lignende syntaks.
"Blocks" blev oprettet for at gøre det nemmere at skrive applikationer til Grand Central Dispatch [1] [2] platformen, men kan også bruges på andre platforme. Apple har implementeret "blokke" i sin egen gren af GCC - kompileren . Et runtime-bibliotek er blevet oprettet til LLVM - kompilere .
"Blokkere" er ligesom funktioner :
I modsætning til funktioner:
For at arbejde med blokke genererer compileren ekstra kode. Under programafviklingen opretter denne kode for hver blok, der er oprettet, et skjult objekt. Objektet indeholder følgende felter:
For at fortælle compileren, at adressen på en "blok" (i stedet for en almindelig funktion) vil blive gemt i en variabel, skal der bruges et særligt nøgleord. Nøgleordet er ikke påkrævet, hvis "blokken" og variablen er i samme omfang .
I det følgende eksempel [3] opretter funktionen en blok og returnerer en markør til den. MakeCounter
#include <stdio.h> #include <Blok.h> // oprettelse af et alias for pointer-to-block typen typedef int ( ^ IntBlock ) (); IntBlock MakeCounter ( int start , int stigning ) { __blok int i = start ; returner Block_copy ( ^ { int ret = i ; i += stigning ; returnere ret ; } ); } int main () { IntBlock my_counter = MakeCounter ( 5 , 2 ); printf ( "Første opkald: %d \n " , min_tæller () ); printf ( "Andet opkald: %d \n " , min_tæller () ); printf ( "Tredje opkald: %d \n " , min_tæller () ); // frigiv den hukommelse, der er allokeret ved oprettelse af blokken for at gemme det skjulte objekt Block_release ( my_counter ); returnere 0 ; }Programmet udskriver følgende.
Første opkald: 5 Andet opkald: 7 Tredje opkald: 9Kommandoen til at kompilere eksemplet med clang- kompileren er:
clang -fblocks blocks-test.c -lBlocksRuntime