2010-02-11 14 views
6

¿Alguien puede explicar cómo funciona @encode para extraer los elementos de tipo de datos presentes en un objeto, estructura o tipo de datos dado en una definición de tipo que se utilizará como descriptor de clase para creación de instancias?¿Cómo se implementa la directiva del compilador @encode en Objective-C?

O tal vez un indicador de algunos recursos para aprender sobre la implementación de nuevas directivas de preprocesador?

+0

Estoy pensando que es sólo una macro-tipo de función que de alguna manera se analiza y se stringifies lo que se aprobó – Anderson

+0

Es curioso, ¿cómo se relaciona el '@ encode' con el lenguaje C (que no tiene esta palabra clave)? Sugiero eliminar la etiqueta 'c'. –

+1

'@ encode' no es una directiva de preprocesador, sino que se basa en información de tipo, como el tamaño de los tipos, algo que el preprocesador no conoce. – dreamlax

Respuesta

1

El fraseo de la pregunta original puede no haber sido claro y creo que mi mención de una posible implementación que involucre al preprocesador hizo que la conversación se volviera hacia las sutilezas de cómo funcionan los compiladores en lugar de la pregunta pretendida.

Por favor, hacen referencia a esta cuestión, que creo que es mucho más claro en cuanto a lo que estoy tratando de aprender: How would I implement something similar to the Objective-C @encode() compiler directive in ANSI C?

+2

No se puede hacer en el preprocesador porque el preprocesador no tiene conocimiento de ningún tipo de información. – dreamlax

5

La directiva @encode analiza el tipo proporcionado y genera una cadena constante basada en ese tipo. La codificación de todos los tipos primitivos C (incluidas las versiones firmada y no firmada) y los tipos Objective-C id y SEL tienen codificaciones de un solo carácter, que se pueden encontrar en <objc/runtime.h>. Los tipos más complicados como struct sy las matrices tienen codificaciones más grandes.

Más información está disponible en el Objective-C Runtime Programming Guide [PDF].

+0

Gracias por su ayuda, pero sé lo que hace. Estoy interesado en CÓMO lo hace. – Anderson

+2

Una vez que la fuente ha sido analizado en un AST, el método encode' @ 'probablemente recorre el árbol e inspecciona los tipos individuales y genera la cadena de eso. – dreamlax

+0

La manera en que yo entiendo es que en tiempo de compilación, descriptores de tipo se generan usando la directiva @encode con el contenido de la cabecera @interface de cada clase. Estos descriptores de tipo se almacenan dentro del binario y la sección .ctors crea una instancia de cada objeto de clase en tiempo de ejecución utilizando la() (constructores) función __ __attribute. – Anderson

Cuestiones relacionadas