在 C++ 中,main 是否可以由函数指针定义?例如:
int f(int, char**) {
return 0;
}
int (*main)(int, char**) = &f;
此代码可以正确编译和链接,但在运行时会触发分段错误。我相信这可能是因为它试图将函数指针的值作为代码执行。
此外,如果在纯 C++ 中不可能,那么可以通过 gcc 的非标准功能来实现(可能以某种方式更改导出符号的类型)。
最后,如果使用 gcc 指令无法实现,是否可以使用自定义链接器脚本来完成?
在 C++ 中,main 是否可以由函数指针定义?例如:
int f(int, char**) {
return 0;
}
int (*main)(int, char**) = &f;
此代码可以正确编译和链接,但在运行时会触发分段错误。我相信这可能是因为它试图将函数指针的值作为代码执行。
此外,如果在纯 C++ 中不可能,那么可以通过 gcc 的非标准功能来实现(可能以某种方式更改导出符号的类型)。
最后,如果使用 gcc 指令无法实现,是否可以使用自定义链接器脚本来完成?
C++ 标准的第 3.6.1/1 段说:
“一个程序应包含一个名为 main 的全局函数,它是程序的指定开始”
这使得指针声明非法。
我无法想象你为什么想要这个,但不,这绝对不可能用纯 C++ 实现。
如果你真的需要这样的东西,只需使用你调用的函数指针作为 main 中的第一个命令。
我相信您尝试做的事情在 C++ 中是不可能的。我能想到的最简单的解决方案是简单地调用f你的 main:
int f(int, char**) {
return 0;
}
int main(int argc, char** argv) {
return f(argc, argv);
}
我也无法想象上述解决方案不起作用的场景。
如果你在 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")));
使用 GCC,您可以使用选项将选项传递给链接器-Wl。然后您可以使用--entry链接器的选项来指定应首先调用哪个函数。
警告:这不会达到您的预期!程序的入口函数实际上不是main函数,而是另一个函数,它建立运行时环境,然后调用你的main函数。
main 是 C 和 C++ 中的关键字,并在程序中作为函数指针名称被覆盖。main 定义了执行的入口点。因此,您的程序没有该功能并覆盖main它的段错误。
另一种“肮脏”的方法是使用汇编创建一个假函数 & 作为该函数的第一条指令,跳转到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;
}
int (*main)(int, char**) = &f;
看起来不正确。
关于什么
int (*main)(int, char**) = f;
?