main函数之前编译器都为你干了什么?

来源:互联网 发布:linux系统维护工程师 编辑:程序博客网 时间:2024/04/29 20:50

vc++开发的程序,程序在调试时总是从main函数开始,这就让很多开发者认为main函数就是应用程序的入口.其实不然,在main函数执行之前,编译器已经为我们干了很多事!

一个小例子即可说明:
#include<iostream>using namespace std;void start(){cout<<"front of the main"<<endl;}class Test{public:Test(int val = 0):value(val){start();}~Test(){}private:int value;};Test a;int main(void){cout<<"main is over"<<endl;return 0;}
运行结果:

front of the main
main is over

由此可以看出,全局对象的构造就是在main函数执行之前完成的 那么问题来了:main函数之前,编译器都干了什么呢?

在VC++6.0中,main函数之前进行的相关工作


GetVersion函数: 获取当前运行平台的版本号
_heap_init函数:用于初始化堆空间
GetCommandLineA函数:获取命令行参数信息首地址
_crtGetEnvironmentStringA函数:获取环境变量信息的首地址
_setargv函数:此函数根据获取的命令行首地址,将命令行参数进行分离,并将分离出的参数个数保存到全局变量_argc中,将每个参数的地址保存到全局变量_argv数组中去,这样就得到了命令行参数的个数以及命令行参数信息
_setenvp函数:此函数根据获得的环境变量的地址信息,将每个环境变量的地址保存到全局变量env数组中去
当调用main函数时,便可以将_argc,_argv,env三个全局变量作为参数传递到main函数中去
_cinit函数:用于全局数据(如全局变量和IO流)和浮点数寄存器的初始化


直到完成以上步骤后,编译器才真正的去调用main函数!



0 0