通过函数指针定义“main”

时间:2013-01-17 12:34:24

标签: c++ c linker linker-scripts

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

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

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

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

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

最后,如果使用gcc指令无法实现,是否可以使用自定义链接描述文件来完成?

8 个答案:

答案 0 :(得分:6)

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

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

这使得指针声明非法。

答案 1 :(得分:4)

我相信你尝试做的事情在c ++中是不可能的。我能想到的最简单的解决方案就是简单地在你的主电话中呼叫f

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

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

我也无法想象上述解决方案不会做的情况。

答案 2 :(得分:4)

我无法想象为什么你会想要这个,但不,这绝对不可能用普通的C ++。

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

答案 3 :(得分:2)

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

警告:这将做您期望的事情!程序的入口函数实际上 main函数,但另一个设置运行时环境的函数和然后调用你的{{1}功能。

答案 4 :(得分:2)

如果你在Linux上,&使用gcc,您可以将main声明为任何其他函数的alias

例如,下面的代码可以工作(至少使用gcc,不用g ++测试):

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

int main(int argc, char* argv[]) __attribute__ ((alias("f")));

答案 5 :(得分:0)

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

答案 6 :(得分:0)

另一种“脏”的方法是使用assembly& amp;创建一个假的功能。作为该函数的第一条指令,跳转到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;
}

答案 7 :(得分:0)

  

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

看起来不正确。

怎么样?
http://welcome.com/about/12/13