Bad*_*adr 30 c c++ program-entry-point
我被问到一个面试问题,将C或C++程序的入口点更改main()
为任何其他函数.这怎么可能?
pax*_*blo 45
在标准C(我相信,C++也是如此)中,你不能,至少不能用于托管环境(但见下文).该标准规定了C代码的起点main
.标准(c99)没有留下太大的争论空间:
5.1.2.2.1程序启动:(1)程序启动时调用的函数名为main.
而已.然后,它会对参数和返回值进行一些讨论,但实际上没有更改名称的余地.
这是针对托管环境的.该标准还允许独立环境(即,没有OS,用于嵌入式系统之类的东西).对于独立环境:
在独立环境中(可以在没有操作系统任何好处的情况下执行C程序),程序启动时调用的函数的名称和类型是实现定义的.除了第4节要求的最小集合之外,任何可用于独立程序的库设施都是实现定义的.
您可以在C 实现中使用"trickery",这样您就可以使它看起来main
不是入口点.这实际上是早期的Windows编译器所做的标记WinMain
为起点.
第一种方式:链接器可能在文件中包含一些预主启动代码,start.o
并且这段代码运行以设置C环境然后调用main
.没有什么可以阻止你用那些调用的东西bob
取而代之.
第二种方式:一些链接器提供了一个命令行开关的选项,以便您可以在不重新编译启动代码的情况下进行更改.
第三种方式:你可以链接这段代码:
int main (int c, char *v[]) { return bob (c, v); }
Run Code Online (Sandbox Code Playgroud)
然后你的代码的入口点似乎bob
而不是main
.
然而,所有这些虽然可能具有学术兴趣,但并没有改变这样一个事实,即在我几十年的切割代码中,我无法想到一个单独的情况,这在某些情况下是必要的或可取的.
我会问面试官:你为什么要这么做?
Lef*_*s E 11
入口点实际上是_start
函数(在crt1.o中实现).
该_start
函数准备的命令行参数,然后调用main(int argc,char* argv[], char* env[])
,您可以从入口点改_start
到mystart
通过设置连接参数:
g++ file.o -Wl,-emystart -o runme
Run Code Online (Sandbox Code Playgroud)
当然,这是入口点的替代,_start
因此您将无法获得命令行参数:
void mystart(){
}
Run Code Online (Sandbox Code Playgroud)
请注意,具有构造函数或析构函数的全局/静态变量必须在应用程序开始时初始化并在结束时销毁.如果您计划绕过自动执行此操作的默认入口点,请记住这一点.
lia*_*iaK 10
从C++标准文档3.6.1主函数,
程序应包含一个名为main的全局函数,它是程序的指定开始.实现定义 是否需要独立环境中的程序来定义主函数.
所以,它确实取决于你的编译器/链接器......