开源地址:https://github.com/dwpeng/argparse
argparse
C语言命令解析器
🎉文档
定义参数
使用ae_defineArgs(name)
来定义参数,其中name
为定义的名字,该宏可以产生一个参数ae_arg_t
数组。ae_arg_t
结构体如下
typedef struct { /* 单短线参数名 */ char* short_arg; /* 双短线参数名 */ char* long_arg; /* 是否跟随参数值 */ ArgValue arg_have_value; /* 传递值 */ char* value; /* 初始值 */ union { int i; bool b; float f; char* s; void* v; } init; /* 参数的说明 */ char* help; } ae_arg_t; typedef enum { AE_YES = 0, AE_NO } ArgValue;
参数分为需要跟随参数值和不跟随参数值两种,需要通过arg_have_value
进行设置,为AE_YES
即为需要参数值,AE_NO
为不需要参数值,在不设置的情况下,默认需要参数值。
通过init
设置初始值,支持多种类型,当参数的arg_have_value
为AE_NO
时,参数值将被存储到init.b
中。
在定义参数值时,参数数组最后必须传递一个AE_END
宏,使其作为数组的最后一个元素。
定义回调函数
通过ae_defineCallback(name)
定义回调函数,name
为回调函数的名字,该宏可以产生一个函数,函数签名如下
typedef void (*callback_t)(int argc, char* argv[], char* env[]);
获取参数
在回调函数内部使用ae_get
来获取参数结构体,函数原型如下
static inline ae_arg_t* ae_get(char* arg_name)
创建解析器
ae_init_parser(char* print_message, print_ae_command_t print_command)
第一个参数为打印信息
第二个参数为如何去打印一个命令中的参数
添加一个命令
static inline void ae_add_command( char* command, // 子命令名,为NULL时,即为全局命令 char* description, // 子命令的描述 char* usage, // 子命令的使用方法 callback_t callback,// 子命令的回调函数 ae_arg_t* args // 子命令对应的参数 )
开始解析
static inline void ae_do_parser(int argc, char* argv[], char* env[])
解析函数与一般的main
函数的参数相同
- 第一个参数为 参数个数
- 第二个参数为 参数值数组
- 第三个参数为 环境变量数组
使用时,main
函数一般使用如下定义
int main(int argc, char* argv[], char* env[])
✨例子
// test.c #include "argparse-new.h" // Step1: 定义参数 ae_defineArgs(help_args) = { { .short_arg = "a", .long_arg = "apple", .init.s = "default_value" }, { .short_arg = "s", .long_arg = "sleep", .arg_have_value = AE_NO, .init.b = 0 }, AE_END }; // Step2: 定义回调函数 ae_defineCallback(help_callback) { ae_arg_t* arg = ae_get("apple"); if (!arg->value) { printf("no value. init: %s\n", arg->init.s); } else { printf("%s\n", arg->value); } printf("%d\n", ae_get("sleep")->init.b); } int main(int argc, char* argv[], char* env[]) { // Step3: 初始化解析器 ae_init_parser("This is a argparse example.", NULL); // Step4: 添加命令 ae_add_command("help", "This is description.", "This is usage.", help_callback, help_args); ae_add_command("testhelp", "This is description.", "This is usage.", help_callback, help_args); // Step5: 开始解析 ae_do_parser(argc, argv, env); }