在C ++中,main是否可以通过函数指针定义?例如:
int f(int, char**) {
return 0;
}
int (*main)(int, char**) = &f;
此代码正确编译和链接,但在运行时会触发分段错误。我相信这可能是因为它试图将函数指针的值作为代码执行。
此外,如果在纯C ++中不可能,那么可以通过gcc的非标准功能实现(可能以某种方式改变导出符号的类型)。
最后,如果使用gcc指令无法实现,是否可以使用自定义链接描述文件来完成?
答案 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
。
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