我正在练习阅读别人的代码,选择了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_NAME
,PACKAGE_NAME
,Version
,AUTHORS
只是常量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)
答案 0 :(得分:2)
注意到函数声明末尾的...
吗?这意味着该函数是varags (variable argument or variadic) function,类似于例如printf
或scanf
。
这意味着该函数可以接受除指定的六个参数之外的任意数量的任何类型的参数。
应该在文档中指定您可以传递的实参类型,但是我想它是一个以空终止的字节串的列表,最后一个需要是NULL
指针来标记结束符。列表。