1. 程式人生 > >glib命令列解析庫簡單使用--GOptionEntry 命令列引數

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中定義的資訊,還有一些輔助函式用來新增一些其它資訊,或對這些資訊的格式進行設定。

下面是一個簡單的示例:

  1. static  gint repeats = 2;  
  2. static  gint max_size = 8;  
  3. static  gboolean verbose = FALSE;  
  4. static  gboolean beep = FALSE;  
  5. static  gboolean rand = FALSE;  
  6. static  gchar *string;  
  7. static  GOptionEntry entries[] =  
  8. {  
  9.   { "repeats" 'r' , 0, G_OPTION_ARG_INT, &repeats, 
    "Average over N repetitions" "N"  },  
  10.   { "max-size" 'm' , 0, G_OPTION_ARG_INT, &max_size,  "Test up to 2^M items" "M"  },  
  11.   { "verbose" 'v' , 0, G_OPTION_ARG_NONE, &verbose,  "Be verbose" , NULL },  
  12.   { "beep" 'b' , 0, G_OPTION_ARG_NONE, &beep,  "Beep when done" , NULL },  
  13.   { "rand" , 0, 0, G_OPTION_ARG_NONE, &rand,  "Randomize the data" , NULL },  
  14.   { "str_test" 's' , 0, G_OPTION_ARG_STRING, &string,  "test the stirng" , NULL},  
  15.   { NULL }  
  16. };  
  17. int
  18. main (int  argc,  char  *argv[])  
  19. {  
  20.   GError *error = NULL;  
  21.   GOptionContext *context;  
  22.   context = g_option_context_new ("- test tree model performance" );  
  23.   g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);  
  24.   // g_option_context_add_group (context, gtk_get_option_group (TRUE));
  25.   if  (!g_option_context_parse (context, &argc, &argv, &error))  
  26.     {  
  27.       g_print ("option parsing failed: %s/n" , error->message);  
  28.       exit (1);  
  29.     }  
  30.   /* ... */
  31. }  

 

GOptionEntry的結構定義為:

  1. typedef struct  {  
  2.   const  gchar *long_name;   // 完整命令 如:--name
  3.   gchar        short_name;    // 簡寫命令 如:-n
  4.   gint         flags;           // GOptionFlags列舉的值
  5.   GOptionArg   arg;    // GOptionArg列舉的值
  6.   gpointer     arg_data; // 解析出來的資料,所要儲存的位置
  7.   const  gchar *description;   // 引數描述,--help可以檢視到
  8.   const  gchar *arg_description;   
  9. } 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