GLIB解析命令行参数

GLIB解析命令行参数

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`

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注