#include #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include #endif typedef struct { int verbose; // -v, --verbose const char *output; // -o, --output const char *config; // --config const char *input; // input argument const char *output_dir; // output_dir argument cbool force; // -f, --force (for subcommand) const char *path; // path argument (for subcommand) } parsed_args_t; int main(int argc, const char **argv, const char **envp) { #ifdef _WIN32 SetConsoleOutputCP(CP_UTF8); SetConsoleCP(CP_UTF8); #endif // 初始化解析结果结构体 parsed_args_t parsed = {0}; parsed.output = "a.out"; // 默认值 parsed.output_dir = "."; // 默认值 parsed.path = "."; // 默认值 // 初始化 argparse scc_argparse_t argparse; scc_argparse_init(&argparse, "demo", "一个命令行参数解析演示工具"); argparse.need_debug = true; argparse.lang = SCC_ARGPARSE_LANG_ZH; // 中文帮助 scc_argparse_cmd_t *root = scc_argparse_get_root(&argparse); // ---------- 添加选项 ---------- // 1. --verbose / -v (计数) scc_argparse_opt_t verbose; scc_argparse_opt_init(&verbose, 'v', "verbose", "增加详细程度(可多次使用)"); scc_argparse_spec_setup_count(&verbose.spec, &parsed.verbose); scc_argparse_cmd_add_opt(root, &verbose); // 2. --output / -o (字符串) scc_argparse_opt_t output; scc_argparse_opt_init(&output, 'o', "output", "输出文件路径"); scc_argparse_spec_setup_string(&output.spec, &parsed.output); scc_argparse_cmd_add_opt(root, &output); // 3. --config (字符串) scc_argparse_opt_t config; scc_argparse_opt_init(&config, 0, "config", "配置文件路径"); scc_argparse_spec_setup_string(&config.spec, &parsed.config); scc_argparse_cmd_add_opt(root, &config); // ---------- 添加位置参数 ---------- // 必需参数: input scc_argparse_arg_t input; scc_argparse_arg_init(&input, "input", "输入文件"); scc_argparse_spec_setup_string(&input.spec, &parsed.input); scc_argparse_spec_set_required(&input.spec, true); scc_argparse_cmd_add_arg(root, &input); // 可选参数: output_dir scc_argparse_arg_t output_dir; scc_argparse_arg_init(&output_dir, "output_dir", "输出目录"); scc_argparse_spec_setup_string(&output_dir.spec, &parsed.output_dir); scc_argparse_spec_set_required(&output_dir.spec, false); scc_argparse_cmd_add_arg(root, &output_dir); // ---------- 子命令 init ---------- scc_argparse_cmd_t init_cmd; scc_argparse_cmd_init(&init_cmd, "init", "初始化仓库"); // 子命令选项: --force / -f scc_argparse_opt_t force; scc_argparse_opt_init(&force, 'f', "force", "强制覆盖"); scc_argparse_spec_setup_bool(&force.spec, &parsed.force); scc_argparse_cmd_add_opt(&init_cmd, &force); // 子命令位置参数: path (可选) scc_argparse_arg_t path; scc_argparse_arg_init(&path, "path", "初始化路径"); scc_argparse_spec_setup_string(&path.spec, &parsed.path); scc_argparse_spec_set_required(&path.spec, false); scc_argparse_cmd_add_arg(&init_cmd, &path); // 将子命令加入根命令 scc_argparse_cmd_add_subcmd(root, &init_cmd); // 解析参数 int ret = scc_argparse_parse(&argparse, argc, argv); // 打印解析结果 if (ret == 0) { scc_printf("\n解析成功\n"); scc_printf("解析到的参数和选项:\n"); scc_printf(" verbose: %d\n", parsed.verbose); scc_printf(" output: %s\n", parsed.output); scc_printf(" config: %s\n", parsed.config ? parsed.config : "(未指定)"); scc_printf(" input: %s\n", parsed.input); scc_printf(" output_dir: %s\n", parsed.output_dir); scc_printf(" force: %s\n", parsed.force ? "true" : "false"); scc_printf(" path: %s\n", parsed.path); } scc_argparse_drop(&argparse); return ret; }