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

时间:2018-12-25 09:22:30

标签: c gnu-coreutils

我正在练习阅读别人的代码,选择了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个参数传递给{ {1}}。

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

parse_long_options

所以,我的问题是,GNU是的,这个包实际上是如何编译和运行的?这是一个UB,至少在C99中。 (1)仅仅是因为如何实施GCC,因此应避免使用它?

直接链接的代码:

coreutils-8.26中的yes.c:(2

来自coreutils-8.26的

long-options.c:(3

来自coreutils-8.26的

long-options.h:(4

GNU的

ftp:(5

1 个答案:

答案 0 :(得分:2)

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

这意味着该函数可以接受除指定的六个参数之外的任意数量的任何类型的参数。

应该在文档中指定您可以传递的实参类型,但是我想它是一个以空终止的字节串的列表,最后一个需要是NULL指针来标记结束符。列表。