1. main函数的概念
(1)C语言中main函数称之为主函数
(2)一个程序是从main函数开始执行的
【编程实验】main函数的原型究竟是什么
//以下四个main函数都是合法的 //第1种 //main() //{ //} //第2种 //void main() //{ //} //第3种:——标准的入口函数 int main() { return 0; } //第3种:——标准的入口函数 //int main() //{ // //没写返回值 //}
【思考】为什么编译器支持那么多种不同的main函数原型?
①历史遗留问题,C早期的程序很简单,只需程序入口地址,程序运行完,并不关心其的结束状态。
②后期C编译器为了兼容早期的程序和商业竞争,厂商让自己的编译器支持更多C类型的程序。
2. main函数的本质
(1)main函数是操作系统调用的函数
(2)操作系统总是将main函数作为应用程序的开始
(3)操作系统将main函数的返回值作为程序的退出代码
【编程实验】main函数的返回值
//A.exe
#include <stdio.h> int main() { printf("I‘m A!\n"); return 0;//返回值0,表示正常结束 }
//B.exe
#include <stdio.h> int main() { printf("I‘m B!\n"); return 99;//返回值非0,表示异常结束 }
【小技巧】
①在命令行中输入:echo %errorlevel% 可以显示一个进程执行后的退出代码
②在命令行中输入:a.exe && b.exe,则该命令会根据a.exe的退出状态(正常退出为TRUE,异常退出为FALSE)来决定是否执行b.exe程序(&&操作符的短路规则!)
3. main函数的参数
(1)程序执行时可以向main函数传递参数
int main();
int main(int argc); //argc为命令行参数个数
int main(int argc,char* argv[]);//argv为命令行参数数组
int main(int argc,char* argv[],char* env[]);//env为环境变量数组, NULL结尾。
(2)当进程被加载时,操作系统会向进程的命令行参数一些参数。以启动gcc为例
gcc a.c b.c c.c //启动gcc并编译a.c、b.c、c.c三个文件
//操作系统向进程传递进程名称(如gcc.exe)、a.c、b.c、c.c等4个参数,其中argc为4,argv[0]为gcc.exe、argv[1]为a.c、argv[2]为b.c、argv[3]为c.c
【实例分析】main函数的参数
#include <stdio.h> //测试时,可在命令行中启动该进程(test.exe),如 //test.exe AAA 123 bbb,则参数为4个,然后显示环境变量的信息 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> //非GCC编译器下,将__attribute__(x)宏定义为空 #ifndef __GNUC__ #define #endif __attribute__((constructor)) void before_main() { printf("%s\n",__FUNCTION__); //__FUNCTION__为当前函数名称 } __attribute__((destructor)) void after_main() { printf("%s\n",__FUNCTION__); //__FUNCTION__为当前函数名称 } int main(int argc,char* argv[], char* env[]) { printf("%s\n",__FUNCTION__); return 0; } //最终显示结果: //before_main //main //after_main
5.小结
(1)一个C程序是从main函数开始执行的,main函数是由操作系统调用的函数
(2)main函数有参数和返回值
(3)现代编译器支持在main函数前(后)调用其它函数