2010-02-11 9 views
6

Qualcuno può spiegare come funziona @encode per estrarre gli elementi datatype presenti in un dato oggetto, struct o datatype in una definizione di tipo da utilizzare come descrittore di classe per l'istanza?Come viene implementata la direttiva del compilatore @encode in Objective-C?

O forse un puntatore ad alcune risorse per conoscere l'implementazione di nuove direttive per il preprocessore?

+0

sto pensando il suo solo una funzione di tipo macro che analizza in qualche modo e stringifies ciò che è passato ad esso – Anderson

+0

Solo curioso, in che modo la '@ encode' si riferisce al linguaggio C (che non ha questa parola chiave)? Suggerisco di rimuovere il tag 'c'. –

+1

'@ encode' non è una direttiva preprocessore, si basa su informazioni di tipo come la dimensione dei tipi, qualcosa di cui il preprocessore non è a conoscenza. – dreamlax

risposta

1

Il fraseggio della domanda originale potrebbe essere stato poco chiaro e penso che la mia menzione di una possibile implementazione che coinvolge il preprocessore abbia fatto sì che la conversazione si volgesse verso le sottigliezze di come funzionano i compilatori piuttosto che la domanda prevista.

fare riferimento a questa domanda, che a mio avviso è molto più chiara di quello che sto cercando di imparare: How would I implement something similar to the Objective-C @encode() compiler directive in ANSI C?

+2

Non può essere eseguito nel preprocessore perché il preprocessore è completamente inconsapevole di qualsiasi tipo di informazione. – dreamlax

5

La direttiva @encode analizza il tipo fornito e genera una stringa costante basata su quel tipo. La codifica di tutti i tipi primitivi C (incluse le versioni firmate e non firmate) ei tipi Objective-C id e SEL hanno codifiche a carattere singolo, che possono essere trovate in <objc/runtime.h>. Tipi più complicati come struct s e matrici hanno codifiche più grandi.

Ulteriori informazioni sono disponibili nello Objective-C Runtime Programming Guide [PDF].

+0

Grazie per il tuo aiuto, ma so COSA fa. Sono interessato a come lo fa. – Anderson

+2

Una volta che l'origine è stata analizzata in un AST, il metodo '@ encode' probabilmente attraversa l'albero e ispeziona i singoli tipi e genera la stringa da quello. – dreamlax

+0

Il modo in cui ho capito è che in fase di compilazione, i descrittori di tipi vengono generati usando la direttiva @encode con il contenuto dell'intestazione @interface di ogni classe. Questi descrittori di tipi sono memorizzati all'interno del file binario e la sezione .ctors crea un'istanza di ogni oggetto di classe in fase di esecuzione utilizzando la funzione __attribute __ ((costruttori)). – Anderson

Problemi correlati