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

C 如何使用GLib强制命令行选项?,c,glib,optional-parameters,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_OPTIO

我使用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_选项_context_parse()上省略其中一个或两个参数,仍然会成功,并且所讨论的值(行和或列)仍然是-1。如果用户没有在命令行上同时传递这两个选项,我如何告诉GLib解析失败?也许我只是瞎了眼,但我找不到一个可以放在我的GOptionEntry数据结构中的标志来告诉它将这些字段设置为必填字段


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

使用GLib无法实现,我检查了文档和源代码。您可能希望提交一个功能请求,和/或尽管存在上述缺陷,但仍继续使用您建议的解决方案。

检查参数是否正确(不包括解析),这也适用于
getopt
。问题是,当将事情设置为“强制性”时,您经常会遇到“强制性”仅在没有其他参数的情况下适用的情况

例如,
/program--help
不需要额外的参数,同样地,
/program--version
也不需要额外的参数。将“require--foo和--bar除非--version或--help”的逻辑放在解析器中本身将接近膨胀和过度复杂

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


总之,你所看到的行为是设计出来的,我认为不太可能改变。如果任何一个变量在解析器运行后仍保持初始化状态,则用户忘记指定相应的选项。

我最近遇到了类似的问题,我认为(目前还不确定,但看起来可行)通过两次回调是可行的。 arg处理回调将执行任何您希望指示正在分析的arg已输入的操作(位掩码?,…)。它还将存储解析后的值(参见下面的gotcha)。将此回调设置为
GOptionArgFunc
,并使用
G_选项_ARG_回调
标志在
GOptionEntry
数组中指向它

解析后回调将检查是否已输入所有必需项。将此回调设置为
gooptionparsefunc
,并使用
g\u option\u group\u Set\u parse\u hooks
指向它

如果使用
g\u option\u group\u new
,则可以将其传递给
user\u data
(位掩码的地址?,…)以在两个回调中使用。使用
g\u option\u group\u add\u entries
g\u option\u context\u set\u main\u group
而不是
g\u option\u context\u add\u main\u entries
来获取与
GOptionContext
关联的组条目


到目前为止,我看到的唯一问题是,您必须设置自己的指向条目数组的指针,以用于实际设置条目的解析值,因为
GOptionEntry
arg\u data
字段将用于指向arg回调函数。

来吧,想想“option”这个词是什么意思。“强制性选择”是一种矛盾修饰法。选项是可选的。你可能把这和“强制性论证”混为一谈,后者是一个合法的概念。您可能希望有一种“命名参数”,比如Python的关键字参数。唯一的好处是可以按任意顺序传递它们,以便进行更多的键入(可能在脚本中更详细是可读性的优势)。无论如何,只有在解析阶段之后验证它才有意义,因为依赖关系可以任意复杂。无论如何,“必选方案”是一个谬论。