传递比 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_NAME
、PACKAGE_NAME
、Version
、AUTHORS
应该只是常量 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,类似于例如printf
或 scanf
.
这意味着该函数可以接受任意数量的任何类型的参数,超出指定的六个。
到底可以传递什么样的参数应该在文档中指定,但我猜它是一个空终止字节字符串列表,最后需要是一个NULL
指针来标记结束的名单。
我正在练习阅读别人的代码,在 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 个参数到 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,类似于例如printf
或 scanf
.
这意味着该函数可以接受任意数量的任何类型的参数,超出指定的六个。
到底可以传递什么样的参数应该在文档中指定,但我猜它是一个空终止字节字符串列表,最后需要是一个NULL
指针来标记结束的名单。