1 main函数的概念
- C语言中main函数称之为主函数。
一个程序是从main函数开始执行的。
下面的main函数定义正确吗?
main()
{}
void main()
{}
int main()
{}
int main()
{return 0;}
2 main函数的本质
- main函数是操作系统调用的函数。
- 操作系统总是将main函数作为应用程序的开始。
- 操作系统将main函数的返回值作为程序的退出状态。
思考:为什么C编译器支持那么多不同的main函数原型?
这个得从历史说起,C语言从诞生的时候就得到了广泛的应用。C语言诞生的时候其实就是unix系统诞生的时期,那个时候的程序非常简单, 很多的C语言程序仅仅是用来做科学计算或者用于非常简单的嵌入式设备中,那些简单嵌入式设备的编程就从原来的汇编语言转到了C语言,然而那些嵌入式设备又由于非常简单,只不过需要知道程序从哪里开始运行那么C语言又恰好满足了这个需求,从main函数开始运行。但是那个时候还没有现在那么多丰富的操作系统,那个时候就直接从一个固定的程序就开始运行了。因此没有操作系统,那么main函数的返回值有什么意义呢。所以说在这样的环境下就干脆不写main函数的返回值了。一方面和历史有关系,另一方面就和商业竞争有关系。
3 main函数的参数
- 程序执行时可以向main函数传递参数。
- int main()
- int main(int argc)
- int main(int argc, char *argv[])
- int main(int argc, char *argv[], char *env[])
argc—命令行参数个数
argv—命令行参数数组
env—环境变量数组
实例分析:main函数的参数
#include <stdio.h>
int main(int argc, char* argv[], char* env[])
{
int i = 0;
printf("============== Begin argv ==============\n");
for(i=0; i<argc; i++)
{
printf("%s\n", argv[i]);
}
printf("============== End argv ==============\n");
printf("\n");
printf("\n");
printf("\n");
printf("============== Begin env ==============\n");
for(i=0; env[i]!=NULL; i++)
{
printf("%s\n", env[i]);
}
printf("============== End env ==============\n");
return 0;
}
4 小技巧
面试中的小问题:main函数一定是程序执行的第一个函数吗?
实例分析:gcc中的属性关键字
#include <stdio.h>
#ifndef __GNUC__
#define __attribute__(x)
#endif
__attribute__((constructor))
void before_main()
{
printf("%s\n",__FUNCTION__);
}
__attribute__((destructor))
void after_main()
{
printf("%s\n",__FUNCTION__);
}
int main()
{
printf("%s\n",__FUNCTION__);
return 0;
}
小结
- 一个C程序是从main函数开始执行的。
- main函数是操作系统调用的函数。
- main函数有参数和返回值。
- 现代编译器支持在main函数前调用其它函数。