Mein Google-Fu ist schwach zu diesem Thema ... (edit/spoiler: _
schließlich nicht das Problem, siehe unten)Laden Symbole, die mit einem Unterstrich beginnen
einig Kontext, ich entwickle eine winzige portable Programm mit Nim. Irgendwann wollte ich getch()
auf win32 verwenden (ein altes Fenster XP) ...
Die Nim doc sagt:
proc getch(): char {.raises: [], tags: [].}
Lesen Sie ein einzelnes Zeichen vom Terminal blockiert, bis sie eingegeben . Das Zeichen wird nicht auf dem Terminal gedruckt. Dies ist nicht für Windows verfügbar.
... so schließlich verwendet I:
proc getch(): cint {.importc: "_getch", header: "<conio.h>".}
und das funktioniert für meine Bedürfnisse in Ordnung. Später jedoch habe ich versucht, stattdessen die dynlib
Pragma verwenden:
proc getch(): cint {.importc, dynlib: "msvcrt.dll".}
die zur Laufzeit fehlschlägt: could not import: getch
. Keine Magie dort, das Symbol sollte mit einem Unterstrich beginnen! Aber _getch
oder sogar `_getch`
sind illegal in Nim.
. (Anmerkung: es war angeblich ein getch
in der CRT aber MS sagt es veraltet ist und wir sollten _getch
stattdessen verwenden)
Um sicher zu gehen, habe ich versucht, das Gleiche mit einem libc Symbol Nim nicht weiß, über:
proc atoi(s: cstring): cint {.importc: "atoi", header: "<stdlib.h>".}
und
proc atoi(s: cstring): cint {.importc, dynlib: "msvcrt.dll".}
dass in beiden Fällen funktioniert; atoi
(offensichtlich) beginnt nicht mit _
.
Ich kann in diesem Fall jetzt mit dem header
Pragma tun, aber das ist ein generelles Problem, das ich wahrscheinlich wieder Angesicht werde, daher meine Frage:
Wie kann ich bekommen Symbole zu importieren, die mit beginnen _
mit dem dynlib
Pragma?
Das beste wäre ein zusätzliches Pragma in der gleichen {. .}
, im Gegensatz zu einem Flag beim Aufruf der Toolchain, aber an dieser Stelle ist jeder Hinweis willkommen. Ich suche nach einer Lösung, die nicht auf externe Bibliotheken oder andere Sprachen angewiesen ist.
Prost.
(Nim 0.13.0)
EDIT: (im Fall laufen andere in den gleichen Problemen)
OK, so dass ich das falsche Problem zu jagen. Wie von @flyx kommentiert, kann importc: "symbol"
mit dynlib
in der gleichen Weise wie in der header
verwendet werden.Die Sache ist, ich hatte es schon einmal versucht und diese Kombination aus den falschen Gründen verworfen (da Nim immer noch stark entwickelt ist, muss ich mal raten ... dieses Mal Pech).
In der Tat:
proc getch(): cint {.importc: "_getch", dynlib: "msvcrt.dll".}
proc kbhit(): cint {.importc: "_kbhit", dynlib: "msvcrt.dll".}
nicht für mich arbeiten. Nicht zur Kompilierungszeit, sondern zur Laufzeit.
Das noch nicht: _getch
nicht zurück, bis ich Ctrl-C es (vielleicht ist das, warum es nicht auf Windows in erster Linie implementiert!) Und mit einer Schleife auf _kbhit
Ich brauche die Aufgabe zu töten.
proc getch(): cint {.importc: "_getch", header: "<conio.h>".}
proc kbhit(): cint {.importc: "_kbhit", header: "<conio.h>".}
TUN Arbeit.
Aber weil jetzt habe ich getestet, erfolgreich
proc atoi64(s: cstring): clonglong {.importc: "_atoi64", dynlib: "msvcrt.dll".}
kann ich sagen, dass der Unterstrich ist ein Nicht-Thema.
'proc getch(): cint {.importc: "_getch", dynlib. "Msvcrt.dll"}' funktioniert nicht? – flyx
@flyx Du hast recht, anscheinend. Ich hatte das versucht, und es gab einen Fehler, also musste ich verwirrt sein und es zu Unrecht als eine illegale Pragma-Kombination abtun ... Schande über mich. Ich könnte verwirrt gewesen sein, weil "_getch" (und einige andere _xxxx-Funktionen) sich nicht richtig zu verhalten scheinen, obwohl ... Ich untersuche, vielleicht ist das ein Anrufkonventionsproblem. Was Sie jedoch geschrieben haben, funktioniert für '_atoi64'. – eruve
@ flyx. Danke für Ihre Hilfe. Ich werde es einen Tag nennen. Ich werde Ihren Kommentar als Antwort markieren, wenn Sie eine Antwort geben. Oder ich mache es später selbst, aber du verdienst die Punkte. – eruve