为什么每个C程序都需要一个叫做main的函数?
2011-10-17 23:11
225 查看
这是个有意思的问题。在 linux 里面,根据TIS 的ELF规范,一个可执行程序,也就是一个可执行的对象文件,它有一个程序进入点,这个进入点不是
我们写的 main 函数,而是位于 c 库中的 _start 汇编代码中。在这个汇编代码中,它会去调用我们写的 main C函数,而这个调用是写死的,所以
我们没办法不用 main 函数。 实际上,假如你的C程序没用用 main 函数,那用 gcc 链接的时候,将会报错。
这个问题,对我们这些学嵌入式系统开发的人来说,应该知道。我们知道,在嵌入式系统上电之后,最先得到执行的将是一小段做初始化用的汇编
代码,这段汇编代码做完硬件如内存控制器的初始化后, 将会给我们准备一个可供 C 程序运行的环境,说白了就是,要准备一个堆栈。 堆栈准备好 后,它会跳转到 C 语言中定义的函数中去继续执行C程序。 那么这个时候,是不是要用 main 函数就随你了,你可以使用其他的,如 tain, bain
之类的任何名称,因为你自己可以修改汇编代码。
回到这个问题,或许可以使用宏来绕过去 main 函数的字面定义 ,但那不是真正的不用main函数,你们可以试一下。
另外 何 也可以研究一下,main 函数在linux 中是如何得到执行的。
我们写的 main 函数,而是位于 c 库中的 _start 汇编代码中。在这个汇编代码中,它会去调用我们写的 main C函数,而这个调用是写死的,所以
我们没办法不用 main 函数。 实际上,假如你的C程序没用用 main 函数,那用 gcc 链接的时候,将会报错。
这个问题,对我们这些学嵌入式系统开发的人来说,应该知道。我们知道,在嵌入式系统上电之后,最先得到执行的将是一小段做初始化用的汇编
代码,这段汇编代码做完硬件如内存控制器的初始化后, 将会给我们准备一个可供 C 程序运行的环境,说白了就是,要准备一个堆栈。 堆栈准备好 后,它会跳转到 C 语言中定义的函数中去继续执行C程序。 那么这个时候,是不是要用 main 函数就随你了,你可以使用其他的,如 tain, bain
之类的任何名称,因为你自己可以修改汇编代码。
回到这个问题,或许可以使用宏来绕过去 main 函数的字面定义 ,但那不是真正的不用main函数,你们可以试一下。
另外 何 也可以研究一下,main 函数在linux 中是如何得到执行的。
相关文章推荐
- 为什么每个C程序都需要一个叫做main的函数
- 【转载】为什么每个C程序都需要一个叫做main的函数
- [阿里巴巴2015校园招聘]写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。 .
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- 需要求3个长方体的体积,写一个基于对象的程序,数据成员包括 length width height 要求用成员函数实现以下功能
- 写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形)、Rectangle(矩形)、Triangle(三角形)。用如下的main()函数,求出定义的几个几何体的面积和。
- 8.2 习题编写一个程序,在遇到EOF之前,把输入作为字符流读取,程序需要打印每个输入的字符及其相应的ASCLL十进制..........
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- 8.9 编写函数打开文件用于输入,将文件内容读入 string 类型的 vector 容器,每一行存储为该容器对象 的一个元素。8.10 重写上面的程序,把文件中的每个单词存储为 容器的一个元素
- 4,在本章第2.6.2(题目错误)节中给出了包含类定义的头文件student.h,包含成员函数定义的源文件student.cpp以及包含主函数的源文件main.cpp。请完善该程序,在类中增加一个对数
- 写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形)、Rectangle(矩形)、Triangle(三角形)。用如下的main()函数,求出定义的几个几何体的面积和
- C++第六周任务5:解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。体会这样安排的优点。
- 新手理解:为什么bio模式的server端每个client都需要对应一个线程
- off() 方法 与 unbind() 方法移除绑定事件的处理程序。one()函数用于为每个匹配元素的一个或多个事件绑定一次性事件处理函数
- 调试使用了函数模块的程序时需要注意的一个小问题
- 为什么c++程序调用c编译器编译的函数需要在调用前加上extern“C”
- 一个班有n个学生,需要把每个学生的简单资料(姓名和学号)输入计算机保存。然后可以通过输入某一学生的姓名查找其有关资料。当输入一个姓名后程序就查找该班有无此学生,如果有,则输出他的姓名和学号,如果找不到
- 调试使用了函数模块的程序时需要注意的一个小问题
- 编写一个程序,其main()调用一个用户定义的函数(以光年值为参数,并返回对应天文单位 的值).该程序按下面的格式要求用户输入光年值
- 将任务4的解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。