⚡
Zigでコマンドライン引数を受け取る
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