1、main之前对全局对象进行初始化工作,会调用全局对象的构造方法。
注意:C++不保证全局对象的初始化顺序,如果全局对象A依赖全局对象B,A需要使用方法对全局对象B封装一下。
2、main之后对全局对象进行清理工作,会调用全局对象的析构方法。
3、main作为程序的入口,只是一种惯例,可以修改,但是不推荐。修改办法:
a、main方法名修改为main_2,重新编译报错:error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
b、右击当前工程-->属性-->配置属性-->链接器-->高级-->入口点,修改为main_2
注意:这样修改后,就不能保证main_2之前对全局对象初始化,main_2之后对全局对象清理的工作了。
4、你可能奇怪,之前的入口点没有写,为什么还能找到main呢?
这是因为 C/C++-->预处理器-->预处理器定义中有:_CONSOLE,同时 链接器-->系统-->子系统:控制台(/SUBSYSTEM:CONSOLE),
可以认为 CONSOLE对应 main
5、对应关系:
main: Windows控制台程序的入口
WinMain: Windows下GUI程序的入口
wmain: Unicode版本的main,w是宽字符
_tmain: 是个宏,Unicode情况下是wmain,否者是main
6、启动控制台程序,打上断点,在调用堆栈中 mainCRTStartup,双击进去,进入文件 crtexe.c,在这个文件调用main方法
调用顺序:mainCRTStartup-->__tmainCRTStartup-->_initterm-->全局对象构造方法-->main方法
7、也就是控制台程序main方法是由mainCRTStartup调用的,对应关系:
CONSOLE<--> mainCRTStartup <-->main
WINDOWS<--> WinMainCRTStartup <-->WinMain
DllMain<--> _DllMainCRTStartup <-->必须使用__stdcall来定义
8、如果想main结束后,还执行一个方法,使用atexit和exit,如下:
atexit(DoSthAtExit); // 注册,在main结束之后调用,在全局对象析构之前调用
//exit(0); //这个调用不是必要的,加在return之前,程序提前结束,导致return不执行
return 0;