传递比 C 原型中指定的更多的参数

passing more parameters than specified in prototype in C

我正在练习阅读别人的代码,在 GNU core-utils 中挑选了一个最简单的包,GNU 是的。具体来说是 coreutils-8.26,因为我的机器是 debian stretch。代码直接链接在最后。

在 main() 中,我们有这一行:

  parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version,
                  usage, AUTHORS, (char const *) NULL);

PROGRAM_NAMEPACKAGE_NAMEVersionAUTHORS 应该只是常量 c 字符串的一些 #define 宏,因此我们确实传递了 8 个参数到 parse_long_options 这里。

在我们包含的 long-options.h 中,我们声明 parse_long_options 如下,它只接受 6 个参数:

void parse_long_options (int _argc,
                     char **_argv,
                     const char *_command_name,
                     const char *_package,
                     const char *_version,
                     void (*_usage) (int),
                     /* const char *author1, ...*/ ...);

所以,我的问题是,这个包,GNU 是的,如何实际编译和 运行?这是一个 UB,至少在 C99 中是这样。 (1)是不是因为GCC的实现方式,所以应该避免?

代码直接链接:

yes.c 来自 coreutils-8.26:(2)

long-options.c 来自 coreutils-8.26:(3)

long-options.h 来自 coreutils-8.26:(4)

GNU 的

ftp:(5)

注意到函数声明末尾的 ... 了吗?这意味着函数是 varags (variable argument or variadic) function,类似于例如printfscanf.

这意味着该函数可以接受任意数量的任何类型的参数,超出指定的六个。

到底可以传递什么样的参数应该在文档中指定,但我猜它是一个空终止字节字符串列表,最后需要是一个NULL指针来标记结束的名单。