c - 如何允许 getopt 和 get_long_opt 也处理任意参数而不发出错误?

标签 c command-line-arguments

我正在编写一个程序 A,它依次调用任意程序 B。 调用 A 时,A 需要一些参数,而另一些参数应该重定向到 B,但 A 不知道这些参数。

我怎样才能让 A 收集那些传递给它的参数,但是无法识别 , 进字典也许。到目前为止,每次我使用:

getopt_long_only(argc, argv, "...

getopt(argc, argv, "...

我收到“无法识别的选项”或“非法选项”的错误。而那些对于A确实无法识别,但我希望A忽略它,你认为这可行吗?

最佳答案

一般来说,这个问题是非常棘手的,甚至是棘手的,除非你为你的程序的使用方式设置一些基本规则。

您可以在调用选项解析器之前通过设置 opterr = 0; 来抑制自动消息。不幸的是,这是简单的部分。

假设您有一个命令行:

wrapper_program -baxt cantaloupe -d designator

进一步,假设 -b-d 都不是包装程序的选项。现在的困难在于确定 -b 选项是否接受参数(在这种情况下,参数是 axt)。如果 -b 不带参数,则还有以 -a 开头的额外选项 — 但是否带参数(即 xt) 还是 x 也是一个选项?如果 x 是一个选项,它是否接受一个参数(将是 t)或者 t 也是一个选项 - 并且确实接受一个参数(将是 cantaloupe)。如果第一个参数 -baxt 有一个附加参数的选项,那么你想要 cantaloupe 选项结束参数解析,还是代码应该做 GNU 风格的参数排列?如果它应该进行参数置换,-d 选项是否采用参数(designator)还是非选项参数?

您可以设置基本规则来解决此类问题,但您必须认真思考并仔细编写代码 — 并进行彻底测试。如果您知道包装的程序采用长参数还是短参数,可能会更容易。

您可能会发现要求包装程序的选项在双破折号之后更好:

wrapper_program -w wrapper-argument -- -b=axt -d designator cantaloupe

这个想法是包装程序的参数在 -- 之前,包装程序的参数在它之后。这在两组参数之间提供了清晰、清晰的分离。

另一种方法是使用“直通”选项(C 编译器通常使用 -Wl,-arg-for-linker 等符号来支持此选项)。例如,-p 选项可能带有一个参数,该参数将逐字传递给包装程序:

wrapper_program -w wrapper-argument -p -b=axt -p -d -p designator cantaloupe

-p 选项指定应将以下参数传递给包装程序。

使用 -b=axt 表示法意味着使用 getopt_long() 而不是 getopt(),尽管如果 - b 接受一个参数,然后 =axt 选项将被 getopt() 视为参数,而 getopt_long() 会, AFAIK,将 axt 视为参数。

谨慎对待此类设计。它们既不容易编写也不一定易于使用。

关于c - 如何允许 getopt 和 get_long_opt 也处理任意参数而不发出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48429761/

相关文章:

c - 从用户空间获取打开文件的引用计数(inode->i_count)

java - 从 Windows 命令提示符将 unicode 字符串传递给 java

c - ftell(FILE* fd) 和 lseek(int fd, off_t offset, int whence) 结果之间的区别

c++ - 如何多次更改核心文件大小限制?

c++ - 这三种说法有什么区别?

NSIS - 在命令行安装期间打印到提示

json - jq:根据参数切片数组

用于解析引用参数的 Java RegEx

c++ - 传递\in C++ 的命令行参数

c++ - C++ strtok跳过第二个标记或连续的定界符