main 函数的概念
- C语言中 mian 函数称为主函数
- 一个C程序是从 main 函数开始的
下面的写法都正确,但是最后一种是标准形式
main()
{}
void main()
{}
int main()
{}
int main()
{
return 0;
}
思考:
为什么C编译器支持那么多 main 函数原型?
这么多种形式也有历史原因,编译器厂商为了商用竞争,更多支持不同形式。同时部分厂商在标准的C标准上右扩展了自己的规范,关键字
main 函数的本质
- main 函数是操作系统调用的函数
- 操作系统总是将 main 函数作为应用程序的开始
- 操作系统将 main 函数的返回值作为程序退出状态
main 函数的返回值实验
在BCC编译环境下实验
补充:
//BCC编译命令
bcc32 file.c
//执行可执行程序(在窗口输入)
file.exe
//显示函数返回值
echo %ERRORLEVEL%
#include <stdio.h>
int main()
{
printf("I'm A!\n");
return 0;
}
// 生成 A.exe
#include <stdio.h>
int main()
{
printf("I'm B!\n");
return 99;
}
// 生成 B.exe
//命令行执行:
B.exe && A.exe
结果:
分析:
B.exe 返回99,操作系统认为程序没有正常结束,就短路了。
// 执行命令
A.exe && B.exe
结果:
分析:
A.exe 返回0,操作系统认为程序正常结束,就运行下一个程序 B.exe
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: 环境变量数组
gcc编译器的常见用法
面试中小问题
- main函数一定是程序执行的第一个函数嘛?
不一定,不同编译器不同的,有些编译器扩张可以在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;
}
before_main
main
after_main
在 main 函数之前执行了函数,这是因为GCC编译器扩展了C标准。
小结
- 一个C程序是从 main 函数开始执行的
- main 是操作系统调用的函数
- main 函数有参数和返回值
- 现代编译器支持在 main 函数前调用其他函数