C语言中之main函数为什么让称程序入口

此前以学Python时,对于类前的__main__判断发生了摸底,后来于上C语言时发现实际上都是互通的。所有的顺序入口,比如main或者WINmain,在过剩编程语言中都归因于主函数之措施面世。下面为大家整理了有顺序入口的基本概念。

 

先是,我们的次第上及入口函数之前,是起了不少业务的。操作系统的配备,启动运行时库,运行时库再初始化好条件,然后启动你的入口函数,你的次第才健康的运转起来。等你的程序运行结束晚,就退到运行时库,然后重新下滑回到操作系统,然后系统又调度外程序执行。

 

在系统将使用权交给我们的是历程,就是网安排我们程序运行的历程,也即是准备上我们先后的入口函数main或者WinMain的进程。操作系统时刻都当运行面临,除非您关机断电了。而负责管理各个程序运行的一部分即是网的调度程序。它直接和畅行警察同样的,管理过程的运作。当你双击的exe程序时,系统会检测到公的鼠标的动作,从而进行拍卖。如果发现而双击的凡某个exe,系统发现而想要实践一个次,便会部署深受您的程序执行。而者布局的人头即便是网的调度程序。调度程序分析我们的exe,获取程序的色,然后才会懂我们先后要什么基础条件。这里说之基本功环境,指的是,程序一旦运行需要的基础运行库。我们因而C语言写的程序要C运行时库,C++的虽要C++运行时库等等,其他的先后自然为急需这些基本库。这些库和网无关。你当出时,选用的开发条件以及工具,都见面控制程序是呀品种,这个和眼前说之次序的运转平台不雷同。Windows程序运行的阳台环境是Windows操作系统,而这体系受还有各种基础环境,保证这个顺序会健康运行的。一般这些都称之为运行时库。我们因而C/C++开发的,如果没有C/C++运行时库的支持,系统便无法启动你的先后了。

 

好家伙是C运行时库?
1)C运行时库就是 C run-time library,是 C 而无 C++
语言世界的概念:取之名字就是是盖你的 C 程序运行时需要这些库中的函数.

2)C
语言是所谓的“小本”语言,就那语言本身来说挺有些(不多之主要字,程序流程控制,数据类型等);所以,C
语言内核开发出来之后,Dennis Ritchie 和 Brian Kernighan 就就此 C
本身又写了 90% 以上的 UNIX
系统函数,并且将里面最常用的片段单独出来,形成头文件和对应的 LIBRARY,C
run-time library 就是这么形成的。

3)随后,随着 C 语言的风行,各个 C
编译器的生产商/个体/团体还按老的风土民情,在不同平台及且发相对应的
Standard Library,但多数兑现都是同各个平台有关的。由于各个 C 编译器对
C 的支持和透亮有众多矛盾和神秘的歧异,所以即使有矣 ANSI C;ANSI C
(主观意图上)详细的确定了 C
语言各个要素的切实意思和编译器实现要求,引进了初的函数声明方式,同时签订了
Standard Library
的专业形式。所以C运行时库由编译器生产商提供。至于由其余厂商/个人/团体供的条文件以及库函数,应当称为第三在
C 运行库(Third party C run-time libraries)。

4)C run-time library里面含有初始化代码,还有错误处理代码(例如divide by
zero处理)。你写的次第可以无math库,程序依然运行,只是不克处理千头万绪的数学运算,不过若是没了C
run-time库,main()就无见面让调用,exit()也未可知叫响应。因为C run-time
library包含了C程序运行的太基本跟最好常用之函数。

5)到了 C++ 世界里,有另外一个定义:Standard C++
Library,它概括了面所说的 C run-time library 和 STL。包含 C run-time
library 的原委大明白,C++ 是 C 的超集,没有理由再还来一个 C++ run-time
library. VC针对C++ 加入的Standard C++ Library主要概括:LIBCP.LIB,
LIBCPMT.LIB和 MSVCPRT.LIB

 

    下面来拘禁一个图示。
图片 1 
   
图中形的是一个操作系统的调度程序的示意图。我们双击了exe,系统先捕获的斯动作,将是要放入调度班,然后调度程序还调度运行。调度程序要先行使依据程序的门类,来启动针对许需之周转时库,然后才进入到我们程序执行。而这运行时库,是我们程序运行起来的根底支撑,就像待先开辟嘴巴,才会用一样。运行时库简单的话,就象是是公这个程序需要之管家。它随时以关切程序的运作,如果程序崩溃大,这个运行时库会掌握之,从而做出处理。当然,运行时库运行于系的督察里。运行时库有点像而的程序的老妈子,同时与操作系统保持联系,算是操作系统及你程序的中间联系人。如此来理解一下运行时库,也就算无碍事知晓了吧。为什么要举行运行时库,因为若程序运行时欲因此到这个中心库咯。而这运行时库,需要由系统来启动运作。
   
总结来拘禁,我们的先后上及入口函数之前,是生了多事情的。操作系统的布局,启动运行时库,运行时库再初始化好条件,然后启动你的入口函数,你的先后才健康的运作起来。等而的程序运行结束晚,就退到运行时库,然后又降回去操作系统,然后系统还调度外程序执行。
    下面一个粗略的主次,从代码上省这个效应。我们形容这代码如下:

void main()
{
    int i = 0;
}

   
然后再度此唯一几句代码里从只断点。光标放在立词代码上,按F9即可。打了断点后,按F5进调剂,调试之界面如下:
    图片 2
   
这个箭头表示,程序都进入了咱的程序,那么我们来看看进入的长河的代码执行过程。在VS界面上找到调用哦堆栈小窗口,然后您见面找到以下调用堆栈窗口:
    图片 3
   
如果您看看的莫是这么的,有为数不少问号的,或者显示什么不可用符号等等,在相应的那么漫长者,右击点击显示或导入“符号”的菜系,然后VS自动更新符号,这样即使可以显示出这些函数分符号名了。
    堆栈的特性就是是先进后出,先进的于脚,这里就是是如此的。
   
执行的逐一从底层至顶部,从顶部可见到,后面的main()表示正在实行及main函数中了。我们于不过底部开始向上看。底部的蝇头修,ntdll.dll是Windows系统的一个骨干库,也是系的着力作用库有,后面的RtlUserThreadStart表示的即使是网以开行我们的exe,并创造了一个经过主线程。然后,第三句kernel.dll这个库里执行了BaseThreadInitThunk执行了咱们的长河的主线程的初始化工作,包括分配线程内存等。
   
然后基本的体系初始化工作且实施了,然后就要开始起步我们的主线程执行了。这个过程就是祈求中说之起步程序及调度程序召开有初始化工作。接下来就会见错过启动运行时库。在过渡下的五独函数执行中,都可看来前ConsoleApplication3起来,这个是咱的先后文件称,这表示马上几个函数都是啊咱先后服务之,这些还是运行于咱们先后的过程空间的,其实就算是我们先后所占的内存块中。mainCRTStartup()函数的CRT就是C
RunTime(C运行时库)的意,这里虽是C运行时库底函数了,它在准备启动main函数的实施了。不过此才刚好启航,是于做初始化运行时环境,就是调用后面的函数__scrt_common_main()。这个函数中举行了着力的运行时环境初始化后,又调用__scrt_common_main_seh()。这个函数也做了扳平文山会海的初始化工作,然后调用invoke_main()函数,去调用main函数运行。
    invoke_main()函数代码如下:

static int __cdecl invoke_main() throw()
{
    return main(__argc, __argv, _get_initial_narrow_environment());
}

   
你可望,这个就算是一个简的调用而已,就如此就是入了我们的main函数的实践。而对这几乎独函数的代码,你可以一直在调用堆栈中双击就可以看到了。
   
调用堆栈中,上一个函数是于下那个函数所调用的,所以这名叫调用堆栈。
   
综上所述,你得起上一些讲述负感受及这进程,在脚的代码级别中,又又同软验证了这个进程,想必对斯过程得更影响深刻了。而我辈的程序代码就是当这进程得后,进入到我们的入口函数开始推行之。
   
然后程序执行完毕后,调用堆栈的函数依次执行了退,最终还要回到了系统的调度函数中履行外程序。