在c ++中,main函数是编程如何将其更改为其他函数的入口点?

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.


然而,所有这些虽然可能具有学术兴趣,但并没有改变这样一个事实,即在我几十年的切割代码中,我无法想到一个单独的情况,这在某些情况下是必要的或可取的.

我会问面试官:你为什么这么做?

  • 制作`main`的+1只是调用别的东西.这是实现这一目标的最直接和跨平台的方法. (7认同)

Lef*_*s E 11

入口点实际上是_start函数(在crt1.o中实现).

_start函数准备的命令行参数,然后调用main(int argc,char* argv[], char* env[]),您可以从入口点改_startmystart通过设置连接参数:

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的全局函数,它是程序的指定开始.实现定义 是否需要独立环境中的程序来定义主函数.

所以,它确实取决于你的编译器/链接器......


Chu*_*dad 7

如果您使用的是VS2010,可能会让您有所了解

由于它很容易理解,这不是C++标准的强制要求,而是属于"实现特定行为"的范畴.