我可以将main()中的代码替换为全局对象的构造函数吗?

Can I replace code in main() into a constructor of a global object?

本文关键字:全局 对象 构造函数 替换 代码 main 我可以      更新时间:2023-10-16

假设 init是在main()之前初始化的最后一个全局对象(并且我们不需要任何命令行参数),我可以这样做:

struct int_main {
  int_main ()
  {
    //... start code execution
  }
}init;
int main ()
{
}

以这种方式问问题,因为我想知道main()是否保证除了:

  1. argc, argv从命令行
  2. 初始化所有全局对象在

您不能保证所有全局对象都是在您的对象之前构造的,因此您不能使用它们中的任何一个。其中包括iostreams的重要部分。

我通常使用main()只构造应用程序对象并在其上调用一个方法来执行实际工作的模式。

您将很难从int_main构造函数捕获任何异常。

在完全展开堆栈的情况下,您将很难返回进程退出代码。

这主要是main在c++中提供的:一个捕获异常的地方,以及一种使用指定进程退出代码正常返回的方法(不仅仅是exit)。

干杯,hth。

在c++中,你可以通过visual studio IDE来声明应用程序的入口点。这是惯例,进入你的代码的入口点将是Main或在win32 exe的情况下WinMain.

为了回答你的问题,CRT将按

的顺序初始化所有全局变量

C基本类型
C结构类型和/或c++类类型
调用类的构造函数
调用入口点到你的应用程序,这将从CRTStartup(纠正我,如果我错了)

理论上这是可能的,但是你不能保证全局对象的初始化顺序,所以你不能保证哪个对象会最后初始化,因此你会遇到一个问题,在全局对象中运行一个"main",在调用它的构造函数之前可能没有正确的程序设置状态。此外,如果发生这种情况,您将无法挂起"main"对象的构造函数的执行以等待适当的启动状态存在。

此外,由于操作系统的运行时将调用实际的main()函数,以便实际"运行"您的程序,而不管是否存在"main"全局对象,您将需要从"main()"返回一个值,以便操作系统运行时确定程序的退出状态。