C语言中的main函数

来源:互联网 发布:进化论不能 知乎 编辑:程序博客网 时间:2024/05/21 09:05

       C语言与许多编译式语言分开了3个阶段:编译、链接、运行。大多数脚本语言不需要标明程序开始执行的位置,


那么C语言为什么要main函数,为什么要从main函数开始执行?我简单的做了自己的几个观点。




1、C语言执行分为3个阶段:编译、链接、运行。每个编辑单元是各自独立编译成目标文件,最后由链接器把这些目

标文件链接成可执行程序。如果C语言可以在文件的全局域里写语句,若只有一个编译单元时问题不大。但对于多个

编译单元,链接器便不知道应先执行哪一个编译单元的全局语句。其中一种可行的解决办法,就是链接时只容许其中

一个编译单元含有全局语句,超过一个就报错。但更简单的做法,是利用不能重复定义函数的机制,若链接时有超过

1个main()函数就报错。而使用main()就解决了链接的问题,不至于链接时不知道从哪个编译单元开始执行。


2、程序不比生物,它只不过是我们人类使用计算机编写出来的,它没有思想,如果你没有指定默认的入口,那么它

也不知道从哪里开始执行。而main函数就是这个约定好的用户代码默认入口,也仅仅是一个指定的入口,也就是说并

不是一定要用main函数,程序也可以从其他函数开始执行,可以指定其他函数为默认的入口。main函数也只是一个函

数而已,只不过是程序默认的入口,所以就显得不一般了。如果你改变了程序的入口,那么在链接的时候就需要指定

默认执行的程序入口即可。


3、从CPU角度来看,将要执行的指令地址放在程序计数器(PC)里,一个程序需要执行,总需要一个入口地址。通

用的可执行文件格式(ELF/PE)总会指定一个入口地址,这样CPU才能开始执行一个程序的指令(由操作系统调

度),所以不管什么语言生成的可执行文件都需要一个入口地址。C语言自然也会有,至于为什么是main函数,这是

C语言标准规定,其实这个函数地址并不是一个可执行文件的真正的入口地址,通常入口地址在C Runtime里,由C

 Runtime调用main函数,而这个被调用的函数可以在链接的时候指定,不必须是main,C Runtime在这里的作用是做

一些C语言的环境准备工作。

0 0