有没有一种标准化的方法来解析C中的命令行参数?

时间:2018-11-22 05:06:53

标签: c linux command-line posix

我正在学习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
    }
}

不是真正可移植的。

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

1 个答案:

答案 0 :(得分:2)

  

是否存在标准化的方法来解析C中的命令行参数?

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

  

解析命令行参数的唯一标准化且可移植的方法是自己完成?

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

  

如果argc的值大于零,则数组成员argv [0]至argv [argc-1](包括在内)应包含指向字符串的指针,这些指针在程序启动前由主机环境提供了实现定义的值。目的是从宿主环境中的其他位置向程序提供在程序启动之前确定的信息。

C标准未引入“命令行”的抽象,因此仅未定义由“命令行参数”和“命令行参数解析”组成的抽象。我认为引入标准的解析命令行参数的方法超出了C标准的范围。

最可移植的方法是 write 并使用最可移植的代码。实际上,最可移植的代码不会使用任何非标准C库,而是以最可移植的方式“自己做”。将所有可能的体系结构和环境作为目标几乎没有意义。如果您只打算使用GNU / Linux,那么如果您想保留一些疯狂的环境,我会选择getopt,如果您只想针对GNU / Linux特定的系统,我会选择argpgetopt确实非常普遍,甚至newlib之类的嵌入式系统库也实现了getoptgetopt_long。对于其他人,您可以将其他源代码中的getopt代码复制/包括到程序中,从而防止没有它的环境。