Beim Lesen der Darwin-Bibliothek in Swift 2.2 habe ich die folgenden Codes gefunden.
%Vor%Was ist '@_silgen_name' in der zweiten Zeile?
Ich habe unten eine Information von hier gefunden, aber Ich möchte mehr Detailinformationen, wie die Apple Developer Library.
Wenn es sich nur um eine bestimmte Gruppe von Swift-Funktionen handelt, die Sie aus C aufrufen möchten, können Sie das Attribut @_silgen_name verwenden, um den fehlenden Namen zu überschreiben, und / oder @convention (c) verwenden, um die C-Aufrufkonvention zu verwenden / p>
@_silgen_name
wurde erst vor Kurzem von @asmname
( siehe folgenden Commit ) mit der neuen Version umbenannt folgende Commit-Nachricht:
Dies spiegelt die Tatsache wider, dass das Attribut nur für Compiler-interne Verwendung und ist nicht wirklich äquivalent zu C asm Attribut, da es die Aufrufkonvention nicht ändert C-kompatibel.
Als allgemeiner Swift-Entwickler würde man also nicht auf dieses Attribut stoßen, es sei denn, es würde beispielsweise Swift auf eine andere Plattform portieren.
Nun ist @_silgen_name
ein Attribut (Makro) für die Klasse SILGenNameAttr
mit bestimmten Optionen, wobei letztere Teil von Swifts ist abstrakter Syntaxbaum (AST) . Aus dem swift/AST/Attr.def
Quellcode (siehe auch swift/lib/AST/Attr.cpp )
Wir finden die Deklaration von SILGeneNameAttr
in swift / AST / Attr. h :
Zusammenfassend; Es bezieht sich auf eine Swift-Schnittstelle für C-Funktionen. Sie werden sehr wahrscheinlich Schwierigkeiten haben, Details zu SILGenNameAttr
in der Entwicklerbibliothek zu finden, und können dies als nicht dokumentierte Funktion betrachten.
Schließlich könnte das folgende Gespräch mit Russ Bishop für Sie von Interesse sein:
Die Toolbox: Hier sind Drachen (34:20)
Ich würde das nicht in einer Produktionsanwendung unter irgendwelchen schicken Umstände. Aber wenn du dich abenteuerlustig fühlst, sind sie hier.
%Vor%
@asmname
ist ein Attribut zum Verzieren einer Funktion. Du brauchst es auf jeden Fall um den ABI zu verstehen, diesen zu benutzen. Swift wird dir nicht helfen Marshall die Parameter sehr. Der Compiler wird nicht sein sehr nachsichtig, also musst du sicherstellen, dass du deine manipuliert hast Parameter in ein Format, mit dem es kompatibel ist. Der folgende Code zeigt, wie man es deklariert. Geben Sie das Funktionsattribut@asmname
und das Zeichenkettensymbol; dann funktionieren seine Argumente im Rückgabetyp. Das Compiler wird sich nicht beschweren, wenn Sie die Argumente falsch erhalten oder zurückgeben falsch eingeben. Es erwartet nur, dass dieses Symbol existiert und wann es springt zu ihm, es besser nehmen diese Argumente und haben diesen Rückgabetyp.Q & A (37:08)
Q : Offensichtlich sind nicht alle diese von Apple dokumentiert. Was ist also Ihr Prozess, all diese Verhaltensweisen zu entdecken?
Russ : Ich schaue mir zuerst die Dokumentation an, aber Sie haben recht, dass es viele Sachen gibt, die nicht drin sind. Wenn du zum Swift gehst REPL und benutze die Flagge - ich denke es ist so etwas wie
-deprecated-integrated-repl
- Sie können es anfordern, das Swift-Modul und alle Bits zu drucken, die Xcode Ihnen nicht anzeigt. Wenn du dich in den toolchain Verzeichnis Xcode, finden Sie auch Sachen in libswiftCore und libswiftRuntime.JP : Wenn Sie mit Swift unsicherere Dinge tun möchten, können Sie in GitHub eine Codesuche für
@asmname
und Sprache durchführen "Swift", und du wirst eine Menge wirklich schlechter, aber interessanter Sachen sehen.
Ein etwas älterer Beitrag aus dem Blog der Bischöfe:
...
Beachten Sie zuerst das Attribut
@asmname
. Dies ist das Äquivalent vonDllImport
oderextern
. Es sagt Swift, dass wir uns eingliedern werden eine Bibliothek, die eine Funktion mit dem angegebenen Namen und der Übereinstimmung definiert die gegebenen Argumente. "Vertrau mir einfach Swift, ich weiß, was ich tue" . Tipp: Du solltest besser wissen, was du tust.
Um kurz zu sagen,
@_silgen_name
definiert einen Namen der Funktion, die in der gemeinsam genutzten Bibliothek angezeigt wird.
Glibc.swift sagt, dass _swift_Glibc_open definiert ist.
Sie können dies durch nm /usr/lib/swift/linux/libswiftGlibc.so
so sehen.