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但是用户可能只是在命令行上传递了这个值,如果值超出范围,我想打印一个单独的错误消息.
由你来检查参数的健全性(除了解析之外),这getopt也是有用的.问题是,当使事情"强制性"时,您经常会遇到"强制性"仅在没有其他参数的情况下适用的情况.
例如./program --help,同样不需要额外的参数./program --version.在解析器本身中使用"require --foo and --bar除非--version OR --help"的逻辑将与膨胀和过度复杂相关.
您只需检查参数的值,line并column在解析参数后确保将它们设置为某些值.check_sanity()如果您担心混乱,完全有可能将所有逻辑放入一个函数中(例如)main().
总之,您所看到的行为是设计的,我不认为它可能会改变.如果在解析器运行后初始化任一变量,则用户忘记指定相应的选项.