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函数的实施。而于此几乎独函数的代码,你可以直接当调用堆栈中双击就可以看到了。
   
调用堆栈中,上一个函数是深受下那个函数所调用的,所以这名叫调用堆栈。
   
综上所述,你可打高达有讲述中感受及之历程,在脚的代码级别中,又又同蹩脚证实了之历程,想必对这个过程得更影响深刻了。而我辈的程序代码就是以斯过程一气呵成后,进入及我们的入口函数开始施行的。
   
然后程序执行完毕后,调用堆栈的函数依次执行完毕退,最终以回去了网的调度函数中实践外程序。