基本の使い方¶
argparse-c を初めて使う場合、まずは以下の 4 ステップを押さえると理解しやすいです。
ap_parser_new(...)でパーサを作るap_add_argument(...)で引数を定義するap_parse_args(...)でコマンドラインを読むap_ns_get_*で結果を取り出す
optional 引数¶
ap_arg_options text = ap_arg_options_default();
text.required = true;
text.help = "text value";
ap_add_argument(parser, "-t, --text", text, &err);
-tと--textの両方を受け付けられますrequired = trueを付けると必須になります
positional 引数¶
ap_arg_options input = ap_arg_options_default();
input.help = "input file";
ap_add_argument(parser, "input", input, &err);
- positional はフラグ無しで宣言します
- usage / help にも positional として表示されます
argument group(カスタム help セクション)¶
関連する引数を help 上でまとまった見出しにしたい場合は、 argument group を使います。
ap_argument_group *output = ap_add_argument_group(
parser, "output", "output formatting controls", &err);
ap_arg_options color = ap_arg_options_default();
color.help = "color mode";
ap_argument_group_add_argument(output, "--color", color, &err);
ap_arg_options target = ap_arg_options_default();
target.help = "target file";
ap_argument_group_add_argument(output, "target", target, &err);
ポイント:
ap_add_argument_group(...)のtitleは必須です- grouped argument でも parse の挙動は通常の引数と同じです
ap_format_help(...)ではカスタムセクションとして表示されます
ap_parser_options 詳細(prefix_chars / allow_abbrev)¶
既存 CLI の流儀に合わせたい場合は、
ap_parser_options_default() を基点に必要な項目だけ上書きします。
ap_parser_options options = ap_parser_options_default();
options.prefix_chars = "+";
options.allow_abbrev = true;
ap_parser *parser =
ap_parser_new_with_options("example1", "custom prefixes", options);
prefix_chars を - から + へ変える例¶
sample/example1.c 相当の短い差分は次のとおりです。
- ap_parser *parser = ap_parser_new("example1", "example1 command.");
+ ap_parser_options options = ap_parser_options_default();
+ options.prefix_chars = "+";
+ ap_parser *parser =
+ ap_parser_new_with_options("example1", "example1 command.", options);
- ap_add_argument(parser, "-t, --text", text_opts, &err);
+ ap_add_argument(parser, "+t, ++text", text_opts, &err);
- ap_add_argument(parser, "-i, --integer", integer_opts, &err);
+ ap_add_argument(parser, "+i, ++integer", integer_opts, &err);
help/usage も +/++ 形式に変わります。
usage: example1 [+h] +t TEXT [+i INTEGER] arg1 [arg2]
optional 引数:
+h, ++help show this help message and exit
+t TEXT, ++text TEXT text field.
+i INTEGER, ++integer INTEGER
integer field.
allow_abbrev=true/false の差分(衝突時動作を含む)¶
++verbose と ++version の 2 つがあるとします。
allow_abbrev = false(既定)++verは部分一致しないため unknown option になります。allow_abbrev = true++verは複数候補に一致するため ambiguous option で失敗します。++verbのように一意な接頭辞なら++verboseとして解決されます。
# allow_abbrev=false
$ prog ++ver
error: unknown option '++ver'
# allow_abbrev=true, 衝突ケース
$ prog ++ver
error: ambiguous option '++ver'
既存 CLI との互換性リスク¶
ap_parser_options の変更は、既存ユーザーに予期しない破壊的影響を与えます。
- シェルスクリプト / CI:
-x/--long前提の既存呼び出しがprefix_chars変更後に失敗する。 - ドキュメント不整合: README や運用手順の引数例が古いままになる。
- 省略解決の不安定化:
allow_abbrev=trueだと、新しい long option 追加時に過去は通っていた短縮形が衝突で失敗し得る。
移行時の実務的な指針:
- 互換要件がない限り
allow_abbrev=falseを維持する。 prefix_charsを変える場合は、ラッパー移行期間やメジャーバージョン更新を検討する。- 正常系だけでなく「曖昧 prefix で失敗するケース」も parse テストに含める。
エラー処理¶
argparse-c はライブラリ内部で exit() しません。失敗時は ap_error を確認し、必要なら ap_format_error(...) で表示用文字列を生成します。
if (ap_parse_args(parser, argc, argv, &ns, &err) != 0) {
char *message = ap_format_error(parser, &err);
fprintf(stderr, "%s", message ? message : err.message);
free(message);
}
ヘルプ表示¶
-h/--help は自動で追加されます。
サンプル: example_test_runner¶
sample/example_test_runner.c は、引数パースの成功/失敗ケースを
単体テスト風に検証する最小サンプルです。
ビルドと実行:
期待される出力例(PASS/FAIL):
PASS: success case parsed --count=3 name=alicePASS: invalid-int case failed as expectedPASS: missing-positional case failed as expectedPASS: all tests passed