- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个程序 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/
我正在编写一个程序 A,它依次调用任意程序 B。调用 A 时,A 需要一些参数,而另一些参数应该重定向到 B,但 A 不知道这些参数。 我怎样才能让 A 收集那些传递给它的参数,但是无法识别, 进字典
我是一名优秀的程序员,十分优秀!