Mein Hintergrund liegt hauptsächlich in C, und da ich mit Zig noch nicht vertraut bin, waren einige der Typkonvertierungen, die erforderlich sind, damit C und Zig sprechen können, zu Beginn nicht ganz klar. Jetzt verstehe ich sie und werde sie kurz zusammenfassen, um hoffentlich allen anderen zu helfen, die es brauchen.
Beginnen wir damit, was ein C-String-Typ in Zig ist. Es gibt zwei empfohlene1 Möglichkeiten, eine C-Saite zu bezeichnen.
// Sentinel slice of unknown amount [*:0]const u8 // Slice of unknown amount [*]const u8
Wenn Sie davon ausgehen können, dass die Zeichenfolge nullterminiert ist, möchten Sie die erste Option, die mit der Funktion std.mem.span in ein Zig-Slice umgewandelt werden kann. Andernfalls benötigen Sie die zweite Option, bei der normalerweise ein Längenparameter an Ihre exportierte Funktion übergeben werden muss, damit Sie ein Slice-by-Length erhalten.
Beispiele:
export pub fn test_c_string(str: [*:0]const u8) void { const local_slice: []const u8 = std.mem.span(str); // rest of function }
export pub fn test_c_string(str: [*]const u8, len: usize) void { const local_slice: []const u8 = str[0..len]; // rest of the function }
Das ist wirklich alles, was Sie für Ihre Anforderungen an die C-Saite wissen müssen. Der Rest der Zig-Strings kann ohne großen Eingriff relativ einfach zwischen Zig-Slice-/Array-Typen konvertiert werden.
Ein Typ, der mich zunächst verwirrte, waren Array-Sentinel-Typen (d. h. [5:0]const u8), weil ich annahm, dass er [*:0]const u8 ähnelte, aber der Unterschied ist die Comptime-Länge (d. h. 5). Wandelt dieses Slice in eine bekannte Länge um, sodass Zig seine Slice-Konvertierungen zwischen ähnlichen Typen problemlos durchführen kann.
Das obige ist der detaillierte Inhalt vonSchnelle Rätsel zur Konvertierung von Zig- und C-Saiten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!