私のバックグラウンドは主に C で、まだ zig に慣れていないため、C と Zig が対話するために必要な型変換の一部が最初は明確ではありませんでした。今ではそれらを理解できたので、それを必要とする他の人を助けるために簡単な概要を説明します。
Zig における C の文字列型とは何かから始めましょう。 C 文字列を表すには 2 つの推奨される1 方法があります。
// Sentinel slice of unknown amount [*:0]const u8 // Slice of unknown amount [*]const u8
文字列が null で終了することが予想される場合は、std.mem.span 関数を使用して Zig スライスに変換できる最初のオプションが必要になります。それ以外の場合は、通常、長さごとのスライスを取得できるように、エクスポートされた関数に長さパラメーターを渡す必要がある 2 番目のオプションが必要になります。
例:
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 }
C 文字列のニーズについて知っておく必要があるのはこれだけです。 Zig の残りの文字列は、多くの介入を必要とせずに、Zig スライス/配列タイプ間でかなり簡単に変換できます。
最初に私を混乱させた型の 1 つは、配列センチネル型 (つまり [5:0]const u8) でした。これは、[*:0]const u8 と似ていると思っていたからですが、違いは comptime の長さ (つまり 5) です。このスライスを既知の長さに変換するため、Zig は類似したタイプ間のスライス変換を簡単に行うことができます。
以上がクイック Zig と C 文字列変換の難題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。