Bloques (extensión del lenguaje C)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 9 de septiembre de 2015; las comprobaciones requieren 8 ediciones .

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 .

Ejemplo

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: 9

El comando para compilar el ejemplo con el compilador clang es:

clang -fblocks bloques-prueba.c -lBlocksRuntime

Véase también

Enlaces

  1. Resumen técnico de Apple sobre Grand Central Dispatch Archivado el 12 de junio de 2009.
  2. Mac OS X 10.6 Snow Leopard: la revisión de Ars Technica: Bloques . Consultado el 29 de septiembre de 2017. Archivado desde el original el 9 de mayo de 2012.
  3. Bengtsson, J., Programación con bloques C en dispositivos Apple , < http://thirdcog.eu/pwcblocks/ > Archivado el 25 de octubre de 2010 en Wayback Machine .