在C语言中,我可以这样做,以使函数中的参数数量不确定:
#include <elf.h>
#include <stddef.h>
#include <stdlib.h>
extern char **__environ;
int __libc_start_main
(
int (*main)(),
int argc,
char **argv
)
{
int ret;
Elf32_auxv_t *auxv;
size_t aux[38];
/* ... */
exit(main(argc, argv, __environ, aux));
}
但是,在C ++中执行此操作时,编译器会发出此错误:
test.c: In function ‘int __libc_start_main(int (*)(), int, char**)’:
test.c:21:45: error: too many arguments to function
exit(main(argc, argv, __environ, aux));
^
如何在C ++中做到这一点?
我知道C / C ++标准不允许这样做,但是我正在编写标准C库的实现。
答案 0 :(得分:3)
简单的答案是:你不会。
在C ++中,所有函数都有一个原型;没有“未指定数量的参数”之类的东西。
如果要将main
称为main(argc, argv, __environ, aux)
,则需要将其声明为int (*main)(int, char **, char **, void *)
或类似名称。
答案 1 :(得分:2)
尝试之一:
void foo(...);
或
template <typename ... ARGS> void foo(ARGS && ... args) { ... body }
第一个选项与void foo()
相同(鲜为人知的C语言事实)。第一个选项需要某种附加参数(例如printf(char *, ...)
,其中第一个参数允许函数检测,解析后面的参数)。
第二个选项要求您在标头中的某个位置提交函数体。