【问题标题】:How to ignore invalid options in getopt_long如何忽略 getopt_long 中的无效选项
【发布时间】:2012-10-16 09:55:11
【问题描述】:

我正在使用函数getopt_long 来获取命令行选项。 当给出无效选项时,我想忽略错误。 目前它向 stderr 打印错误,例如:

 invalid option -- 's'

【问题讨论】:

    标签: c++ c linux getopt


    【解决方案1】:

    getopt.h 中有变量opterr,如果您将其设置为 0,它将避免将错误打印到stderr

    只需将其设置为 0:

    extern int opterr;
    
    opterr = 0;
    

    【讨论】:

    • 呵呵,你是对的,这是可能的。正如我在现在已删除的答案中指出的那样,这不能可靠地工作:选项可能有参数 (sed -e),因此对于未知选项,无法确定以下参数是否应该被解释为新选项或无效选项的参数。因此,虽然您的答案是正确的,但我不建议您使用它,除非您真的知道自己在做什么,并且了解您将遇到的与您的程序未来版本的不兼容类型。
    • 顺便说一句,如果你使用这个,你应该只包含<unistd.h>,而不是手动声明opterr
    • 这只是为了忽略getopts_long打印的stderr,仅此而已。不确定会出现什么不兼容。 opterr 不是局部变量。它在 getopt.h 中声明,并且可以选择设置为这种情况。我无法看到已删除的答案,反正还没有:)
    • 我的意思是,如果程序的未来版本接受带有参数的 -e 选项,那么未来版本会将 -e -i 视为单个选项(-i-e),但旧版本会将其视为不带参数的忽略 -e 选项和单独的 -i 选项。类似地,-e x 将被视为新版本中 -e 选项的参数 x,而忽略的 -e 选项和单独的 x 命令行参数通常被视为文件名。
    • 至于<getopt.h>,这是特定于平台的。 POSIX 标头是<unistd.h>,无论您使用哪个标头,它都应该已经声明opterr,而您的代码不必说extern int opterr;。 (getopt_long 不是 POSIX 的一部分(除非它已经被添加),但 getopt 和它的 opterr getopt_long 是。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2020-05-24
    • 1970-01-01
    相关资源
    最近更新 更多