如何在不指定C ++所有参数的情况下声明程序的main()入口点?

时间:2019-06-21 12:46:35

标签: c++ c

在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库的实现。

2 个答案:

答案 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 *, ...),其中第一个参数允许函数检测,解析后面的参数)。

第二个选项要求您在标头中的某个位置提交函数体。