コメント(// と ///)
『Zig』のコメントは『//』による一行コメントと、ドキュメントコメントとしての『///』の2種類があります。ブロックコメント(『/* */』)はZigには存在しません。ドキュメントコメント(『///』)は直後の宣言に紐づき、標準ツールによって自動ドキュメントとして抽出されます。
構文
// 一行コメント — // から行末までがコメントになります。
const x: i32 = 10; // 行末コメント — コードの後にも書けます。
/// ドキュメントコメント — 直後の宣言(関数・型・定数等)を文書化します。
/// 複数行書く場合は各行に /// を付けます。
/// 自動ドキュメントツールが解析して HTML 等を生成します。
pub fn exampleFunction() void {}
コメントの種類
| 種類 | 書き方 | 概要 |
|---|---|---|
| 一行コメント | // テキスト | 『//』から行末までがコメントになります。実装の説明やデバッグ用途に使います。 |
| ドキュメントコメント | /// テキスト | 直後の宣言(関数・構造体・定数・変数等)を文書化します。Zigの標準ドキュメントツールが解析します。 |
Zigにはブロックコメント(『/* */』)はありません。複数行コメントを書く場合は各行に『//』または『///』を付けます。
ドキュメントコメントと自動ドキュメント化
『///』で始まるドキュメントコメントは直後の宣言に関連付けられ、ビルドシステムの自動ドキュメント生成機能で利用されます。Zigの公式ドキュメント(docs.ziglang.org の標準ライブラリリファレンス)もこの仕組みで生成されています。
ドキュメントコメントとして認識されるには、コメントと宣言の間に空行を挟まないことが必要です。
| 記法 | 説明 |
|---|---|
| 宣言の直前に書く | コメントと宣言の間に空行を挟まないようにします。空行があるとドキュメントコメントとして認識されません。 |
| 各行に /// を付ける | 複数行のドキュメントコメントは各行の先頭に『///』を付けます。 |
| Markdown を使える | ドキュメントコメント内でMarkdown記法(コードブロック、リスト等)が使えます。 |
| pub 宣言が対象 | ドキュメントは主にエクスポートされた宣言(pub)に付けます。内部実装には通常の『//』を使います。 |
コメントを書くべき場所・書かなくてよい場所
| 判断 | 場面 | 理由 |
|---|---|---|
| 書くべき | 「なぜこう実装したか」の理由 | コードを読むだけではわからない設計意図やトレードオフを残しておくと、将来の自分や他の開発者が助かります。 |
| 書くべき | unsafe な操作の前提条件 | Zigでは呼び出し元が満たすべき前提条件(precondition)をコメントで明示することが重要です。 |
| 書くべき | エクスポートされた(pub)宣言 | 『///』でドキュメントコメントを付けておくと自動ドキュメントに反映されます。 |
| 書かなくてよい | コードを読めば明らかな処理 | 自明な説明はノイズになります。変数名・関数名をわかりやすくすれば不要になります。 |
| 書かなくてよい | 変更履歴・削除したコード | バージョン管理(git)があるため、コメントに古いコードや変更日を残す必要はありません。 |
サンプルコード
コメントの書き方(一行・ドキュメントコメント)を確認するサンプルコードです。
comment_basic.zig
// comment_basic.zig — Zig のコメント構文の基本的な使い方です。
const std = @import("std");
// 商品数を定数として定義します
const item_count = 3;
pub fn main() void {
// 商品名と価格の配列を定義します
const items = [item_count][]const u8{ "widget", "gadget", "device" };
const prices = [item_count]i32{ 1200, 3500, 800 }; // 税抜価格
var total: i32 = 0;
for (0..item_count) |i| {
std.debug.print("{s:<10} {d:>5} yen\n", .{ items[i], prices[i] });
total += prices[i];
}
std.debug.print("----------\n", .{});
std.debug.print("{s:<10} {d:>5} yen\n", .{ "Total", total });
}
$ zig run comment_basic.zig widget 1200 yen gadget 3500 yen device 800 yen ---------- Total 5500 yen
comment_doc.zig
// comment_doc.zig — /// ドキュメントコメントの使い方です。
const std = @import("std");
/// 整数スライスの合計値を計算して返します。
///
/// 引数:
/// values — 合計を計算する i32 スライス
///
/// 戻り値:
/// 全要素の合計値(i32)
pub fn sum(values: []const i32) i32 {
var total: i32 = 0;
for (values) |v| {
total += v;
}
return total;
}
/// 整数スライスの平均値を計算して返します。
///
/// スライスが空の場合は null を返します。
///
/// 引数:
/// values — 平均を計算する i32 スライス
///
/// 戻り値:
/// 平均値(f64)。スライスが空の場合は null。
pub fn average(values: []const i32) ?f64 {
if (values.len == 0) {
// 空スライスは計算不能なので null を返します
return null;
}
// 整数除算を避けるため f64 にキャストします
return @as(f64, @floatFromInt(sum(values))) / @as(f64, @floatFromInt(values.len));
}
pub fn main() void {
const scores = [_]i32{ 85, 92, 78, 95, 60 };
std.debug.print("Sum: {d}\n", .{sum(&scores)});
if (average(&scores)) |avg| {
std.debug.print("Average: {d:.1}\n", .{avg});
}
// 空スライスのケース
const empty = [_]i32{};
const result = average(&empty);
std.debug.print("Empty: {any}\n", .{result});
}
$ zig run comment_doc.zig Sum: 410 Average: 82.0 Empty: null
よくあるミス
ドキュメントコメントと宣言の間に空行を入れる
『///』と宣言の間に空行があると、ドキュメントコメントとして認識されません。コンパイルエラーにはなりませんが、自動ドキュメントに反映されなくなります。
/// この関数を説明します。(ドキュメントとして認識されません)
pub fn example() void {} // 空行があるため /// がドキュメントに結びつかない
ブロックコメントを書こうとする
Zigには『/* */』というブロックコメントはありません。複数行コメントを書く場合は各行の先頭に『//』または『///』を付けます。
/* これはコンパイルエラーになります */ // NG: Zig にブロックコメントはない // これが Zig の複数行コメントの正しい書き方です。 // 各行に // を付けます。
概要
Zigのコメントは『//』による一行コメントと、ドキュメントコメントとしての『///』の2種類です。Zigには『/* */』のようなブロックコメントは存在しません。複数行にわたるコメントを書く場合は各行に『//』または『///』を付けます。
『///』ドキュメントコメントは直後の宣言に紐づき、自動ドキュメント生成ツールが解析します。Zigの公式標準ライブラリドキュメントもこの仕組みで生成されています。エクスポートされた宣言(pub)には『///』でドキュメントコメントを付けるのが慣習で、内部実装には通常の『//』を使います。コメントと宣言の間に空行を挟まないことが重要です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。