假设 init
是在main()
之前初始化的最后一个全局对象(并且我们不需要任何命令行参数),我可以这样做:
struct int_main {
int_main ()
{
//... start code execution
}
}init;
int main ()
{
}
以这种方式问问题,因为我想知道main()
是否保证除了:
- argc, argv从命令行
- 初始化所有全局对象在
您不能保证所有全局对象都是在您的对象之前构造的,因此您不能使用它们中的任何一个。其中包括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()"返回一个值,以便操作系统运行时确定程序的退出状态。