C语言做命令行解析,说复杂也不复杂,GNU库提供了getoptargp两个命令行解析工具,甚至自己用strcmp就能实现。但是当命令繁多,需要嵌套子命令,或是需要更多的自定义时,这两个库就不够看了。

根据我自己使用上的需要和总结,我写了一个自己的命令行解析库cmdparser。在使用简单、保证代码简洁的同时,也提供了很多扩展点,同时有完善的测试和使用示例。

项目地址:https://github.com/XUJINKAI/cmdparser

主要特点:

  • 定义在一个结构体中,保证代码结构清晰简单。

  • 常见的长短选项支持 -a --all -n XJK --name=XJK --age 18,短选项支持缩写-an XJK

  • 子命令支持嵌套,支持别名。

  • 动态控制子命令和长短选项隐藏或停用。

  • 自定义帮助文档和错误提示信息。

使用示例

定义一个全局的结构体,指定好回调函数,然后调用cmdp_run函数即可。

static cmdp_command_st cmdp = {
    .options = {
        {'i', "Int", "Input Int Option", CMDP_TYPE_INT4, &arg.i},
        {0},                        // 以{0}结束
    },
    .fn_process = callback,         // 回调函数
};

int main(int argc, char **argv)
{
    return cmdp_run(argc - 1, argv + 1, &cmdp);
}

其中arg是一个全局的结构体,用于储存解析结果,完整的代码在demo_simple

嵌套子命令,可设置sub_commands字段,如下:

static cmdp_command_st cmdp = {
    .options = {...},
    .sub_commands = (cmdp_command_st[]){
        {
            .name = "sub",
            .options = {...},
            .fn_process = sub_callback,
        },
        {0},                        // 以{0}结束
    },
};

demo_git是一个仿照git命令的示例程序,展示了更复杂的情况。

test目录中是测试代码,其中有自定义错误提示为子命令设置别名等示例。

这套库迭代了好几版,现在趋于稳定,自己用着感觉不错,所以放出来,欢迎star和提issue。

https://github.com/XUJINKAI/cmdparser