2010-02-11 12 views
6

Kann jemand erklären, wie @encode funktioniert, um die in einem gegebenen Objekt, einer Struktur oder einem Datentypen vorhandenen Datentypelemente in eine Typdefinition zu extrahieren, die als Klassendeskriptor für die Instanziierung verwendet werden soll?Wie wird die @ encode Compiler Direktive in Objective-C implementiert?

Oder vielleicht ein Zeiger auf einige Ressourcen für das Lernen über die Implementierung neuer Präprozessordirektiven?

+0

Ich denke, es ist nur eine Funktion vom Typ Makro, das und stringifies parst irgendwie was passiert ist dazu – Anderson

+0

Nur neugierig, wie bezieht sich der '@ encode' auf die C-Sprache (die dieses Schlüsselwort nicht hat)? Ich schlage vor, das "c" -Tag zu entfernen. –

+1

'@ encode' ist keine Präprozessordirektive, sie beruht auf Typinformationen wie der Größe von Typen, etwas, das dem Präprozessor nicht bekannt ist. – dreamlax

Antwort

1

Die Formulierung der ursprünglichen Frage war möglicherweise unklar, und ich denke, dass meine Erwähnung einer möglichen Implementierung mit dem Präprozessor die Konversation dazu veranlasste, sich den Feinheiten der Funktionsweise von Compilern und nicht der beabsichtigten Frage zuzuwenden.

Beziehen Sie sich auf diese Frage, die ich glaube, viel mehr klar, ist das, was ich versuche zu lernen: How would I implement something similar to the Objective-C @encode() compiler directive in ANSI C?

+2

Es kann nicht in dem Präprozessor getan werden, da der Präprozessor keine Typeninformation vollständig kennt. – dreamlax

5

Die Anweisung @encode analysiert den angegebenen Typ und generiert eine konstante Zeichenfolge basierend auf diesem Typ. Die Kodierung aller C-Primitivtypen (einschließlich signierter und unsignierter Versionen) und der Objective-C-Typen id und SEL haben alle eine Ein-Zeichen-Kodierung, die unter <objc/runtime.h> zu finden ist. Kompliziertere Typen wie struct s und Arrays haben größere Codierungen.

Weitere Informationen finden Sie in der Objective-C Runtime Programming Guide [PDF].

+0

Danke für Ihre Hilfe, aber ich weiß, was es tut. Ich bin daran interessiert, wie es funktioniert. – Anderson

+2

Sobald die Quelle in eine ASTs geparst wurde, durchläuft die Methode '@ encode' wahrscheinlich die Baumstruktur und untersucht die einzelnen Typen und generiert daraus die Zeichenkette. – dreamlax

+0

Die Art, wie ich es verstehe, besteht darin, dass zum Zeitpunkt der Kompilierung Type Deskriptoren mit der @encode-Direktive mit dem Inhalt der @ interface-Header jeder Klasse erzeugt werden. Diese Typdeskriptoren werden in der Binärdatei gespeichert, und der Abschnitt .ctors instanziiert jedes Klassenobjekt zur Laufzeit mit der Funktion __attribute __ ((Konstruktoren)). – Anderson

Verwandte Themen