Blocks ( ing. blocks ) es una extensión de los lenguajes de programación C , C++ , Objective-C , no descritos en los estándares de estos lenguajes y creados por Apple . La extensión le permite crear cierres utilizando una sintaxis similar a lambda .
Se crearon "bloques" para facilitar la escritura de aplicaciones para la plataforma Grand Central Dispatch [1] [2] , pero también se pueden usar en otras plataformas. Apple ha implementado "bloques" en su propia rama del compilador GCC . Se ha creado una biblioteca de tiempo de ejecución para los compiladores LLVM .
Los "bloques" son como funciones :
A diferencia de las funciones:
Para trabajar con bloques, el compilador genera código adicional. Durante la ejecución del programa, para cada bloque creado, este código crea un objeto oculto. El objeto contiene los siguientes campos:
Para decirle al compilador que la dirección de un "bloque" (en lugar de una función normal) se almacenará en una variable, se debe usar una palabra clave especial. La palabra clave no es necesaria si el "bloque" y la variable están en el mismo ámbito .
En el siguiente ejemplo [3] , la función crea un bloque y le devuelve un puntero. MakeCounter
#incluir <stdio.h> #include <Bloque.h> // creando un alias para el tipo de puntero a bloque typedef int ( ^ IntBlock ) (); IntBlock MakeCounter ( int inicio , int incremento ) { __bloque int i = inicio ; volver Block_copy ( ^ { int ret = yo ; i += incremento ; volver ret ; } ); } int principal () { IntBlock mi_contador = HacerContador ( 5 , 2 ); printf ( "Primera llamada: %d \n " , mi_contador () ); printf ( "Segunda llamada: %d \n " , mi_contador () ); printf ( "Tercera llamada: %d \n " , mi_contador () ); // libera la memoria asignada al crear el bloque para almacenar el objeto oculto Block_release ( my_counter ); devolver 0 ; }El programa imprimirá lo siguiente.
Primera llamada: 5 Segunda llamada: 7 Tercera convocatoria: 9El comando para compilar el ejemplo con el compilador clang es:
clang -fblocks bloques-prueba.c -lBlocksRuntime