我使用GLib來解析一些命令行選項。問題是我想讓這些選項中的兩個是強制性的,以便程序在幫助屏幕終止,如果用戶省略它們。如何使用GLib強制執行命令行選項?
我的代碼如下所示:
static gint line = -1;
static gint column = -1;
static GOptionEntry options[] =
{
{"line", 'l', 0, G_OPTION_ARG_INT, &line, "The line", "L"},
{"column", 'c', 0, G_OPTION_ARG_INT, &column, "The column", "C"},
{NULL}
};
...
int main(int argc, char** argv)
{
GError *error = NULL;
GOptionContext *context;
context = g_option_context_new ("- test");
g_option_context_add_main_entries (context, options, NULL);
if (!g_option_context_parse(context, &argc, &argv, &error))
{
usage(error->message, context);
}
...
return 0;
}
如果我省略這些參數中的一個或兩個在命令行g_option_context_parse()仍然成功,問題中的值(線或列)仍然是 - 1。如果用戶沒有通過命令行上的兩個選項,我怎麼能告訴GLib失敗解析?也許我只是盲目的,但我找不到可以放入我的GOptionEntry數據結構中的標誌,告訴它使這些字段成爲強制性的。
當然,我可以檢查其中一個變量是否仍爲-1,但用戶可能已經在命令行上傳遞了此值,並且如果值超出範圍,我想打印單獨的錯誤消息。
來吧,只要想一想「選項」這個詞的意思。 「強制性選擇」是一個矛盾。選項是可選的。你可能把它與「強制性論證」混在一起,這是一個合理的概念。您可能想要有一種「命名參數」,如Python的關鍵字參數。唯一的好處是可以按任意順序傳遞它們,以便進行更多類型的輸入(可能在腳本中使用更多的冗長是可讀性的優點)。無論如何,在解析階段之後驗證它是有意義的,因爲依賴關係可以是任意複雜的。無論如何,「所需選項」是一個謬誤。 – 2014-06-23 11:28:23