【问题标题】:Is there a standardized way to parse command line arguments in C?是否有一种标准化的方法来解析 C 中的命令行参数?
【发布时间】:2018-11-22 05:06:52
【问题描述】:

我正在学习 C 编程语言并尝试用它做一些基本的事情。我面临的问题是如何解析命令行参数。我阅读了this answer 并试图在标准N1570 中找到unistd.h 函数的库摘要。但不幸的是,它没有在那里定义(据我所知,仅适用于符合 POSIX 的操作系统)。

AFAIK Windows 并不是真正符合 POSIX 标准,所以类似于我上面提到的答案

#include <unistd.h>

int main(int argc, char *argv[]){
    int opt;
    while((opt = getopt(argc, argv, "ilv") != -1){
        //do some with it
    }
}

不是很便携。

问题:解析命令行参数的唯一标准化和可移植方法是自己做吗?

【问题讨论】:

  • 几乎和 C 语言中的所有其他东西一样......但getopt 被广泛传播。 Windows 有很好的 gcc 版本,其中 getopt 工作得很好。嵌入式系统,它们不需要参数。
  • getopt() 是 POSIX,getopt_long() 是 GNU,你可以搜索其他库,或者自己做。
  • @Jean-FrançoisFabre 关于嵌入式系统的要点。没有考虑到。谢谢。
  • 虽然 ISO/C 规范和 POSIX 定义了一些 libc 函数,但 POSIX 是一个超集,因此请遵循它来代替 ISO/C 函数。例如,POSIX 定义了与系统调用、网络套接字等相关的东西,而 ISO/C 没有。 linux 内核对 libc 函数(即系统调用)的支持遵循 POSIX 和 not ISO/C。在嵌入式系统上,您必须查阅嵌入式操作系统的文档(如 Jean-Francois 所述)。
  • 是的,有标准。不,没有 A C 标准。

标签: c linux command-line posix


【解决方案1】:

是否有一种标准化的方式来解析 C 中的命令行参数?

是的,有。不是由 C 委员会标准化,而是由其他人标准化。最常见的是 POSIX,它的 Utility Conventionsgetopt 实用程序。使用GNU Argument Syntaxargp 既有趣又酷。还有常用的 GNU getopt_long 用于支持 getopt 的长参数。

解析命令行参数的唯一标准化和可移植方式是自己做吗?

C11 中没有标准化的方式来解析命令行。 C11 仅指定主要参数是字符串,但它们的值只是实现定义的:

如果 argc 的值大于零,则数组成员 argv[0] 到 argv[argc-1] 应包含指向字符串的指针,这些指针在程序启动之前由主机环境给出实现定义的值。目的是从托管环境中的其他地方向程序提供在程序启动之前确定的信息。

C 标准没有引入“命令行”的抽象,因此没有定义由“命令行参数”和“命令行参数解析”组成的抽象。我认为引入一种标准化的方式来解析命令行参数超出了 C 标准的范围。

最便携的方式是编写并使用最便携的代码。事实上,最可移植的代码不会使用任何非标准的 C 库,而是以最可移植的方式“自己动手”。针对所有可能的体系结构和环境几乎没有意义。如果您只针对 GNU/Linux,如果您想保持对某些疯狂环境的可移植性,我会选择getopt;如果您只想针对 GNU/Linux 特定系统,我会选择argpgetopt 非常普遍,甚至像 newlib 这样的嵌入式系统库也实现了 getoptgetopt_long。对于其他人,您只需将 getopt 的代码从其他来源复制/包含到您的程序中,从而防止没有它的环境。

【讨论】:

  • 只是说,getopt() 不是 GNU 发明,而是早于 AT&T unix 版本的 v7,我的东西。只是我的两分钱。
猜你喜欢
  • 2011-12-15
  • 2022-01-19
  • 2012-11-16
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多