glib官方文档参看:https://docs.gtk.org/glib/struct.OptionContext.html
首先,在C代码中定义一个 GOptionEntry 类型的数组,使用 g_option_context_add_main_entries 和 g_option_context_parse 等函数,让命令行按照此数组进行解析。GOptionEntry 的定义和说明参考官方文档:https://docs.gtk.org/glib/struct.OptionEntry.html
参数解析类型定义为 GOptionArg ,官方文档:https://docs.gtk.org/glib/enum.OptionArg.html。根据不同类型,需要提供不同的变量,或者处理函数进行处理。
代码:
// gcc -o test gargs.c -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/sysprof-6 -pthread -lglib-2.0
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
static gboolean boolarg = FALSE;
static gchar **cfg_names = NULL;
static gchar *run_user = NULL;
static gint num = 0 ;
static GOptionEntry entries[] =
{
{ "bool", 'f', 0, G_OPTION_ARG_NONE, &boolarg, "bool arg default false", NULL },
{ "config", 'c', 0, G_OPTION_ARG_FILENAME_ARRAY, &cfg_names, "Specify config file(s)", NULL },
{ "user", 'u', 0, G_OPTION_ARG_STRING, &run_user, "User to run test", NULL },
{ "num", 'n', 0, G_OPTION_ARG_INT, &num, "get args num", NULL},
// 最后一个是结束标志
{ NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL }
};
static void
read_cmd_line (gint *argc, gchar ***argv)
{
GError *error = NULL;
GOptionContext *context;
guint cfg_num;
// 创建一个参数解析上下文
context = g_option_context_new ("- run test");
// 添加一个说明,--help打印中,在参数列表之前打印。
g_option_context_set_summary (context, "Summary:\n A g_option test 。");
// 如果主组不存在,则创建主组,并向其添加参数解析条目
g_option_context_add_main_entries (context, entries, NULL);
// 解析
if (!g_option_context_parse (context, argc, argv, &error)) {
fprintf (stderr, "option parsing failed: %s\n", error->message);
g_option_context_free (context);
exit (EXIT_FAILURE);
}
// 释放参数解析上下文空间
g_option_context_free (context);
}
int main(int argc, char *argv[]){
read_cmd_line (&argc, &argv) ;
g_print("bool[%s] run_user[%s] num[%d]", boolarg?"TRUE":"FALSE", run_user, num ) ;
if( cfg_names != NULL ) {
for( gint i=0; i<g_strv_length(cfg_names) ; ++i ) {
g_print(" config[%s]", cfg_names[i] ) ;
}
}
g_print("\n") ;
return 0 ;
}
编译和测试:
编译指令:gcc -o test gargs.c `pkg-config --cflags --libs glib-2.0`

发表回复