C语言为什么必须有main函数
来源:互联网 发布:申请域名需要多少钱 编辑:程序博客网 时间:2024/04/30 11:53
- #include <stdio.h>
- int main()
- {
- printf("Hello World!";
- return 0;
- }
涉及到的crt系列文件包括crt1.o,crti.o,crtn.o,crtbegin.o,crtend.o。这一系列crt.o的作用马上就会看到。
当我们运行这个C程序的时候,我们需要一个可供程序运行的c runtimeenvironment。就好比操作系统需要运行在硬件之上,C程序需要运行在c runtimeenvironment之中。ubuntu下的c runtime enviroment就是由上述crt系列定义的(crt是cruntime的缩写)。
crt在main程序运行之前为我们做了这些:
1.建立stdin/stdout/stderr流
2.将main函数接受的两个参数(argc,argv)压入栈中,供main调用
3.不同的操作系统还可能要求的一些其他操作。
抽象介绍不好理解,上代码。
一个最简单的crt文件可以用如下汇编表示:
上面这段代码执行了一个crt文件的最基本操作:读取需要传送给_start的两个参数argcargv,然后以逆序压入栈中,然后调用main函数,main返回时,从栈中弹出argcargv。然后将main的返回值存储在eax中。调用exit函数告诉系统main已结束。
- extern main
- extern exit
- global _start
- _start:
- mov eax, [esp + 4]
- mov ebx, [esp + 8]
- push ebx
- push eax
- call main
- add esp, 8
- push eax
- call exit
如果在链接时不加入crt部分会有什么效果?还是让gcc告诉我们吧。-nostdlib命令会让gcc在链接时不链接一切标准函数库,包括crt系列。(为了方便测试,我将hello_world中的printf函数注释掉了,然后将文件重命名为test_main.c。不注释掉printf的效果还是各位看官自己测试吧)
输入gcc -o test test_main.c -nostdlib 然后运行test 效果如下图所示:
根据warning与error的内容我们可以很容易的推断出 main函数没有被加载到的结论。
关于“为什么必须有main”的问题暂时讨论至此,很多具体到细节的内容仍待完善。
main函数补充:一般情况下我们用的main函数都是int main()。但是标准C实际上定义了四种main的原型:
int main(void) int main()int main(int argc, char **argv)int main(int argc, char *argv[])一二类似,三四类似。第三(四)种的直接作用就是我们可以从终端中读取参数。
argc=0时,argv[0]为程序本身的名字。代码如下
#include <stdio.h>int main(int argc,char **argv){运行结果如下:int i; for(i=0;i<argc;i++) printf("argc[%d] : %s\n",i,argv[i]); return 0;}
在linux环境下还存在第五种声明:
int main(int argc, char **argv, char **envp)envp代表了程序的运行时环境。具体内容还请各位看官自行写代码研究。
藩外篇:我的函数可以在main之前执行!
(下述内容来源于http://www.drdobbs.com/cpp/184401956)
在标准c下,函数是不可能在main之前执行的。但是有了gcc这个强大的编译器,nothing is impossible。
在gcc环境下,我们可以通过给函数增加一个attribute的方式,实现在main开始之前或者结束之后执行函数。格式如下:
void myConstructor( void ) __attribute__ ((constructor));void myDestructor( void ) __attribute__ ((destructor));
经测试,下述在gcc 4.6.4下运行正常。输出结果如下图所示:
末尾附加C语言小知识点一个与大家分享:
- #include <stdio.h>
- int main()
- {
- char *p = "helloworld";
- priintf("%c",*(ptr++));
- return 0;
- }
下一篇预告:hello world是如何显示到屏幕上的--linux下C语言的标准输入输出流
- C语言为什么必须有main函数
- C语言为什么必须有main函数
- 为什么c语言从main函数开始
- 为什么main函数中的变量必须初始化
- C语言main函数
- C语言main函数
- c语言main函数
- C语言main函数
- C语言之main()函数
- C/C++语言 main函数
- C语言main()函数详解
- C语言main()函数详解
- C语言main函数参数
- C语言中的main函数
- C语言main()函数详解
- C语言main()函数详解
- C语言之main函数
- C语言main函数参数
- Drupal Views开发过程中使用说明4
- xml読み込み用digester-rules
- 看起来很厉害的样子
- 关于乱码的那些事儿
- MongoDB管理与开发精要《红丸出品》4.10 客户端GUI工具
- C语言为什么必须有main函数
- 正确时间使用正确工具找到正确答案
- 关于复制文件或文件夹时提示没有足够的可用磁盘空间的解决办法-释放磁盘空间,磁盘整理
- IOCP应用
- QT:我自己封装的一个简易的二维表类SimpleTable
- PostgreSQL启动过程中的那些事十六:启动进程一
- 2.CSS文字颜色定义,背景色定义
- 深度剖析C++模型对象
- 黑马程序员--线程及共享变量