Zigでコマンドライン引数を受け取る

2022/12/09に公開

ziglangでコマンドライン引数を受け取りたくて試行錯誤しました。

環境

WSLにzigをインストールするやり方がわからなかったので、Windows環境でやりました。
Linuxにあまりなれていないので……。

PS >  zig version
0.11.0-dev.368+1829b6eab

ソース

以下の記事を参考にしました。
Zig: コマンドライン引数を受け取って整数(i32)に変換する

ただ、Windows環境だとstd.os.argvは使えないみたいで、コンパイルエラーとなりました。

C:\zig\lib\std\os.zig:250:17: error: argv isn't supported on Windows: use std.process.argsAlloc instead
    .windows => @compileError("argv isn't supported on Windows: use std.process.argsAlloc instead"),
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
referenced by:
    main: main.zig:6:24
    callMain: C:\zig\lib\std\start.zig:614:32
    remaining reference traces hidden; use '-freference-trace' to see all reference traces

エラーメッセージに従って、std.process.argsAlloc()を使ったのが下のソースです。

main.zig
const std = @import("std");
const process = std.process;
const dprint = std.debug.print;

pub fn main() anyerror!void {
    const allocator = std.heap.page_allocator;
    const args = try process.argsAlloc(allocator);
    
    const stdout = std.io.getStdOut().writer();
    try stdout.print("{s}\n", .{args[1]});
    try stdout.print("{s}\n", .{args[2]});
}

実行

実行してみます。
zigはコンパイル言語ですが、zig run srcfileでビルドと実行を同時にできます。
-- arg1 arg2...のように--のあとに半角スペース区切りでコマンドライン引数も指定できます。

PS > zig run main.zig -- abc cde
abc
cde

無事コマンドライン引数をzigで受け取り、標準出力できました。

追記(2022/12/10)

あのあと無事WSLにZigを導入できたのでstd.os.argvでもやってみました。
無事できました。Windows環境じゃなかったら大丈夫みたいです。

const std = @import("std");
const dprint = std.debug.print;

pub fn main() !void {

    const args = std.os.argv;
    dprint("{s}\n", .{args[1]});
}

Discussion