glib命令列解析庫簡單使用--GOptionEntry 命令列引數
轉自:http://blog.csdn.net/ciahi/archive/2010/12/15/6076786.aspx
官網文件為:
http://library.gnome.org/devel/glib/stable/glib-Commandline-option-parser.html
簡單來說,就是定義GOptionEntry結構,這個結構裡面包含了命令項名字、型別以及簡單介紹
然後建立GOptionContext,把定義的GOptionEntry結構放到GOptionContext中,呼叫g_option_context_parse就可以將命令選項都解出來
預設情況下,-h和--help可以檢視程式的幫助,這個幫助資訊是使用的GOptionEntry中定義的資訊,還有一些輔助函式用來新增一些其它資訊,或對這些資訊的格式進行設定。
下面是一個簡單的示例:
- static gint repeats = 2;
- static gint max_size = 8;
- static gboolean verbose = FALSE;
- static gboolean beep = FALSE;
- static gboolean rand = FALSE;
- static gchar *string;
- static GOptionEntry entries[] =
- {
- { "repeats"
,
'r'
, 0, G_OPTION_ARG_INT, &repeats,
- { "max-size" , 'm' , 0, G_OPTION_ARG_INT, &max_size, "Test up to 2^M items" , "M" },
- { "verbose" , 'v' , 0, G_OPTION_ARG_NONE, &verbose, "Be verbose" , NULL },
- { "beep"
,
'b'
, 0, G_OPTION_ARG_NONE, &beep,
"Beep when done"
, NULL },
- { "rand" , 0, 0, G_OPTION_ARG_NONE, &rand, "Randomize the data" , NULL },
- { "str_test" , 's' , 0, G_OPTION_ARG_STRING, &string, "test the stirng" , NULL},
- { NULL }
- };
- int
- main (int argc, char *argv[])
- {
- GError *error = NULL;
- GOptionContext *context;
- context = g_option_context_new ("- test tree model performance" );
- g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
- // g_option_context_add_group (context, gtk_get_option_group (TRUE));
- if (!g_option_context_parse (context, &argc, &argv, &error))
- {
- g_print ("option parsing failed: %s/n" , error->message);
- exit (1);
- }
- /* ... */
- }
GOptionEntry的結構定義為:
- typedef struct {
- const gchar *long_name; // 完整命令 如:--name
- gchar short_name; // 簡寫命令 如:-n
- gint flags; // GOptionFlags列舉的值
- GOptionArg arg; // GOptionArg列舉的值
- gpointer arg_data; // 解析出來的資料,所要儲存的位置
- const gchar *description; // 引數描述,--help可以檢視到
- const gchar *arg_description;
- } GOptionEntry;
編譯之後,可以這樣執行程式
./a.out -r 10 -b -s test
-b後面不能跟引數,因為這個引數型別為:G_OPTION_ARG_NONE。儲存它的變數是一個bool型的值,當有這個引數的值,這個bool值是TRUE,否則是FALSE。
這樣當執行完g_option_context_parse函式之後,就會發現repeats、beep、string裡面都有值了。這兒要注意的是,string這個引數,在使用完了,需要自己來釋放,否則的話就會有記憶體洩露。
下面這個網址裡面是一些不錯的示例程式碼,比較詳細的說明了這塊的用法
https://dev.mobileread.com/svn/iliados/upstream/glib-2.6.6/tests/option-test.c
原來在glib的原始碼裡面就有詳細用法
glib-2.26.0/glib/tests/option-context.c