3

在 C++ 中,main 是否可以由函数指针定义?例如:

int f(int, char**) {
    return 0;
}

int (*main)(int, char**) = &f;

此代码可以正确编译和链接,但在运行时会触发分段错误。我相信这可能是因为它试图将函数指针的值作为代码执行。

此外,如果在纯 C++ 中不可能,那么可以通过 gcc 的非标准功能来实现(可能以某种方式更改导出符号的类型)。

最后,如果使用 gcc 指令无法实现,是否可以使用自定义链接器脚本来完成?

4

8 回答 8

6

C++ 标准的第 3.6.1/1 段说:

“一个程序应包含一个名为 main 的全局函数,它是程序的指定开始”

这使得指针声明非法。

于 2013-01-17T12:38:33.017 回答
4

我无法想象你为什么想要这个,但不,这绝对不可能用纯 C++ 实现。

如果你真的需要这样的东西,只需使用你调用的函数指针作为 main 中的第一个命令。

于 2013-01-17T12:37:56.280 回答
4

我相信您尝试做的事情在 C++ 中是不可能的。我能想到的最简单的解决方案是简单地调用f你的 main:

int f(int, char**) {
    return 0;
}

int main(int argc, char** argv) {
  return f(argc, argv);
}

我也无法想象上述解决方案不起作用的场景。

于 2013-01-17T12:37:54.617 回答
2

如果你在 linux 上,并且使用 gcc,你可以声明mainalias任何其他函数。

例如,以下代码有效(至少使用 gcc,未使用 g++ 测试):

int f(int argc, char* argv[]) {
    printf("hello world\n");
    return 0;
}

int main(int argc, char* argv[]) __attribute__ ((alias("f")));
于 2013-01-17T13:20:37.733 回答
2

使用 GCC,您可以使用选项将选项传递给链接器-Wl。然后您可以使用--entry链接器的选项来指定应首先调用哪个函数。

警告:不会达到您的预期!程序的入口函数实际上不是main函数,而是另一个函数,它建立运行时环境,然后调用你的main函数。

于 2013-01-17T12:41:36.747 回答
0

main 是 C 和 C++ 中的关键字,并在程序中作为函数指针名称被覆盖。main 定义了执行的入口点。因此,您的程序没有该功能并覆盖main它的段错误。

于 2013-01-17T12:38:35.837 回答
0

另一种“肮脏”的方法是使用汇编创建一个假函数 & 作为该函数的第一条指令,跳转到f.

下面是目标的gcc具体代码intel

asm(".globl main");           // main is not static
asm(".type main, @function"); // main is a 'function'
asm("main: jmp f");           // main starts here. jump to `f`

int g(){ //Some random function may be present in between "main" & "f"...
    puts("hello universe");
}

int f(int argc, char* argv[]) {
    int i;
    puts("hello world");
    printf("%d arguments given\n",argc - 1);
    for(i=0;i<argc;i++) puts (argv[i]);
    g();
    return 0;
}
于 2013-01-17T13:34:29.407 回答
0

int (*main)(int, char**) = &f;

看起来不正确。

关于什么

int (*main)(int, char**) = f;

?

于 2016-03-22T12:10:45.323 回答