Zu Testzwecken muss ich einige Definitionen zwischen Tcl und C teilen. Ist es möglich, C-Stil-Include-Datei in Tcl-Skripts enthalten? Jeder alternative Vorschlag wird begrüßt, aber ich möchte keinen Parser für die C-Header-Datei schreiben.wie gemeinsame Definition zwischen c und tcl zu teilen
Antwort
SWIG unterstützt Tcl, so dass Sie möglicherweise davon Gebrauch machen können. Außerdem erinnere ich mich daran, Code zu sehen, der C-Header im Tcl-Wiki analysiert - also könntest du versuchen, die Seite Parsing C dort anzusehen. Das sollte Sie davor bewahren, von Grund auf neu zu schreiben.
Wenn Sie eine vollständige API mit beliebiger Komplexität ausführen, sollten Sie SWIG (oder critcl †) verwenden, um die Bindung durchzuführen. SWIG kann eine Bindung zwischen einer C API und Tcl mit sehr wenig Benutzereingabe (oft fast keine) durchführen. Es sollte jedoch beachtet werden, dass die von ihm erzeugten APIs aus einer Tcl-Perspektive nicht sehr natürlich sind (weil Tcl nicht C ist und verschiedene Idiome hat).
Doch wenn Sie stattdessen nach einem gewissen Art und Weise nur die einfachstenen Teile der Definitionen der Handhabung - nur die #define
s von numerischen Konstanten - dann ist die einfachste Art und Weise zu behandeln, dass über ein bisschen regulären Ausdruck Parsing ist:
proc getDefsFromIncludeFile {filename} {
set defs {}
set f [open $filename]
foreach line [split [read $f] "\n"] {
# Doesn't handle all edge cases, but does do a decent job
if {[regexp {^\s*#\s*define\s+(\w+)\s+([^\s\\]+)} $line -> def val]} {
lappend defs $def [string trim $val "()"]
}
}
close $f
return $defs
}
Es macht einen vernünftigen Job auf Tcl eigene Header. (Handhabung bedingte Definitionen und verschachtelte #include
Anweisungen wird als Übung, ich schlage vor, Sie versuchen, Ihre C-Header zu ordnen, um diese Übung überflüssig zu machen.) Wenn ich das tue, die ersten paar Definitionen extrahiert sind:
TCL_ALPHA_RELEASE 0 TCL_BETA_RELEASE 1 TCL_FINAL_RELEASE 2 TCL_MAJOR_VERSION 8
† Critcl ist eine andere Art, Tcl/C-Bindungen zu machen, und es funktioniert durch Einbetten der C-Sprache in Tcl. Es kann sehr natürlich arbeitende Tcl-Schnittstellen zu C-Code erzeugen; Ich finde es toll. Ich glaube jedoch nicht, dass es für das, was Sie versuchen, nützlich ist.
Wenn Sie über die Integration von Struktur- oder Funktionsdefinitionen nachdenken, sollten Sie sich SWIG ansehen. Leider müssen Sie wahrscheinlich zusätzlichen Tcl-Code um das von SWIG erzeugte Interface legen. (Zum Beispiel wandelt SWIG ganze Zahlen, die wirklich Flagsätze sind, nicht in das natürliche Tcl-Äquivalent, eine Liste von Flag-Wörtern.) –
Danke, ich brauche nur share defined, also wird dein Vorschlag und Parsing-Beispiel gut genug sein. – Ilya
gefunden an einem anderen Ort: "Tcl hat seine eigene ausgezeichnete Schnittstelle zu C-Code. Ich würde empfehlen, nur zu studieren, anstatt Zeit auf SWIG zu verschwenden.", Aber habe noch nichts gefunden, so habe ich noch Hoffnung für einige #include wie Syntax, die ich gerade nicht finden kann, benutzte nie tcl in meinem Leben :) wird einige mehr untersuchen ... – Ilya
Das bezieht sich auf die Leichtigkeit des Erweiterns von Tcl, um mit externen Bibliotheken zu arbeiten. Es ist sehr einfach, tcl zu erweitern, aber Sie sagten, Sie wollen nur einige Definitionen teilen. Da C streng ist, müssen Sie ein grundlegendes Parsing der .h-Datei implementieren - möglicherweise genügt nur das Regex-Matching. Wenn Sie eine vollständige Schnittstelle wünschen, rufen Sie DLL-Methoden von Tcl auf - dann sollten Sie eine Erweiterung schreiben. – patthoyts
Danke, werde versuchen, es zu tun. – Ilya