注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。
测试环境:Ubuntu 10.10
GCC版本:4.4.5
一、main函数的概念
1) C语言中main函数称之为主函数
2) 一个C程序是从main函数开始执行的
下面的main函数定义正确吗?
A:正确
B:正确
C:正确
D:正确
编程实验
main函数的原型究竟是什么
33-1.c
int main()
{
return 0;
}
二、main函数的本质
1) main函数是操作系统调用的函数
2) 操作系统总是将main函数作为应用程序的开始
3) 操作系统将main函数的返回值作为程序的退出状态
思考:
为什么C编译器支持那么多不同的main函数原型?
很多编译器都存在商业竞争,为了更利于编程,编译器不断优化改善,更灵活的适应编程。
编程实验
main函数的返回值
33-2-A.c
#include <stdio.h>
int main()
{
printf("I'm A!\n");
return 0;
}
操作:
1) gcc 33-2-A.c -o 33-2-A.out编译正确,打印结果:
I'm A!
33-2-B.c
#include <stdio.h>
int main()
{
printf("I'm B!\n");
return 99;
}
操作:
1) gcc 33-2-B.c -o 33-2-B.out编译正确,打印结果:
I'm B!
2) 如何在gcc下显示main函数返回值。
命令:echo $?
显示:99
三、main函数的参数
1)程序执行时可以向main函数传递参数
int main()
int main(int argc)
int main(int argc,char *argv[])
int main(int argc,char *argv[],char *env[])
argc-命令行参数个数
argv-命令行参数数组
env-环境变量数组
2)gcc编译器的常见用法:
gcc a.c b.c c.c
argc ---> 4
argv[0] ---> gcc
argv[1] ---> a.c
argv[2] ---> b.c
argv[3] ---> c.c
实例分析
main函数的参数
33-3.c
#include <stdio.h>
int main(int argc, char* argv[], char* env[])
{
int i = 0;
printf("============== Begin argv ==============\n");
printf("argc = 1");
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;
}
操作:
1) gcc 33-3.c -o 33-3.out编译正确,打印结果:
====== Begin argv ======
argc = 1
./33-3.out
====== End argv ======
======= Begin env ======
====== End env ======
分析:
命令:./33-3.out ==> argc = 1 就一个参数:./33-3.out argv[0] = "./33-3.out"
2) 命令:./33-3.out a.c b.c c.c
====== Begin argv ======
argc = 4
./33-3.out
a.c
b.c
c.c
====== End argv ======
======= Begin env ======
====== End env ======
四、小技巧
1) 面试中的小问题
main函数一定是程序执行的第一个函数吗?
不一定。gcc下有属性关键字。
__attribute__((constructor)):main函数之前执行
__attribute__((destructor)):main函数之后执行
实例分析
gcc中的属性关键字
33-4.c
#include <stdio.h>
#ifndef __GNUC__ //如果不是gcc编译器,就定义宏
#define __attribute__(x)
#endif
__attribute__((constructor)) // constructor给before_main函数一个属性,提示编译器运行main()先执行defore_main()
void before_main()
{
printf("%s\n",__FUNCTION__); //标准的c中__FUNCTION__代表函数名
}
__attribute__((destructor)) // destructor给after_main函数一个属性,提示编译器运行完main()函数后执行defore_main()
void after_main()
{
printf("%s\n",__FUNCTION__);
}
int main()
{
printf("%s\n",__FUNCTION__);
return 0;
}
操作:
1) gcc 33-4.c -o 33-4.out编译正确,打印结果:
before_main
main
after_main
小结:
1) 一个C程序是从main函数开始执行的
2) main函数是操作系统调用的函数
3) main函数有参数和返回值
4) 现代编译器支持在main函数前调用其它函数(尽量不要依赖编译器写代码!!)