Ich konvertiere die Header-Dateien einer C-Bibliothek in D-Module und fragte mich, wie ich mit C-Strings umgehen sollte.Wie soll ich mit C-Strings in D umgehen?
Mit DMD 1, das funktioniert:
void f(char* s); // Definition for C library's function.
Aber mit DMD 2 (die ich persönlich benutze, aber ich würde die Module wie für beide arbeiten) Strings werden const, so den gleichen Code erhalten mit Die Module funktionieren
void f(const(char)* s); // Definition for C library's function.
Was soll ich tun? Verwenden Sie einfach char*
und machen Sie den 'Client' Code machen die Strings irgendwie veränderbar? Oder ändern Sie den Typ abhängig von der Version des Compilers, der den Code kompiliert? Wenn Ersteres, was ist der beste Weg, sie veränderbar zu machen? Ich dachte, dup würde es tun, aber der Compiler hatte keinen Balken davon. Wenn letzteres, wie würde ich es tun? Ich versuchte dies:
version (D_Version2) {
alias const(char)* charptr;
} else {
alias char* charptr;
}
void f(charptr s);
Aber ach, die DMD-2-Version ist nicht gültigen Code für DMD 1, und der gesamte Code in Version Blöcke müssen einen gültigen Code für den Compiler, den Code kompilieren, selbst wenn der Code wouldn‘ t in der resultierenden ausführbaren Datei enthalten sein. So kompiliert der Code derzeit in beiden, aber Sie müssen zuerst den Alias ändern, der, wie Sie sich vorstellen können, nicht ideal ist.
Hallo wieder. Ich sollte dich bezahlen:]. Der Mixin-Trick funktioniert nicht; 'Fehler: Bezeichner 'charptr' ist nicht definiert. ' Das macht Sinn; Ich denke nicht, dass es tatsächlich Funktionen gibt, die einen Puffer verwenden, aber ich werde es mir merken. zu 'LPCSTR': Meine Unix-Sensibilität würde dadurch zu sehr beleidigt sein, denke ich. 'cstring'? – Bernard
Das Code-Snippet funktioniert für mich. Hast du 'std.compiler' importiert (das Modul, in dem' version_major' deklariert ist)? –
Ich tat es jetzt; gleiches Ergebnis. v2.0.31 – Bernard