如何使用GLib强制命令行选项?

ahe*_*ahe 5 c glib optional-parameters

我使用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;
}
Run Code Online (Sandbox Code Playgroud)

如果我在命令行中省略了其中一个参数或两者都没有,那么g_option_context_parse()仍然成功,并且有问题的值(行和/或列)仍为-1.如果用户没有在命令行上传递这两个选项,我怎么能告诉GLib解析失败?也许我只是盲目但我找不到我可以放入GOptionEntry数据结构的标志,告诉它要强制使用这些字段.

当然我可以检查其中一个变量是否仍为-1但是用户可能只是在命令行上传递了这个值,如果值超出范围,我想打印一个单独的错误消息.

Tim*_*ost 9

由你来检查参数的健全性(除了解析之外),这getopt也是有用的.问题是,当使事情"强制性"时,您经常会遇到"强制性"仅在没有其他参数的情况下适用的情况.

例如./program --help,同样不需要额外的参数./program --version.在解析器本身中使用"require --foo and --bar除非--version OR --help"的逻辑将与膨胀和过度复杂相关.

您只需检查参数的值,linecolumn在解析参数后确保将它们设置为某些值.check_sanity()如果您担心混乱,完全有可能将所有逻辑放入一个函数中(例如)main().

总之,您所看到的行为是设计的,我不认为它可能会改变.如果在解析器运行后初始化任一变量,则用户忘记指定相应的选项.