- C 语言中 main 函数称之为主函数
- 一个 C 程序是从 main 函数开始执行的
下面的 main 函数定义正确吗?linux
A.面试
main() { }
B.shell
void main() { }
c.编程
int main() { }
D.数组
int main() { return 0; }
A B C D 编译无警告,无错误,运行正常bash
D 为最标准函数
- main 函数是操做系统调用的函数
- 操做系统老是将 main 函数做为应用程序的开始
- 操做系统将 main 函数的返回值做为程序的退出状态
思考:为何 C 编译器支持那么多不一样的 main 函数元原型呢?操作系统
C 语言诞生初期就获得的普遍的应用,,当时的程序比较简单,主要应用于科学运算或嵌入式设备中。在当时的环境下,只须要知道入口函数在哪里即可以,在非操做系统中运行,返回值是无心义的。命令行
随着商业编译器的竞争与发展,编译器开始支持更多的 C 语言特性,并对编译器的功能进行扩展。指针
A.C
#include <stdio.h> int main() { printf("I'm A!\n"); return 0; }
B.c
#include <stdio.h> int main() { printf("I'm B!\n"); return 99; }
命令行:【GCC】 ./a.out && ./b.out 输出: I'm A! I'm B! 命令行:【GCC】 ./b.out && ./a.out 输出: I'm B!
在操做系统中的做用
操做系统中存在批处理语言。在 linux 中为 shell 脚本,其联合各类应用程序协做完成任务,经过应用程序返回值监控程序的运行状态。
- 程序执行时能够向 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 编译器的常见用法
./a.out a.c b.c c.c
argc ---> 4 argv[0] ---> a.out argv[1] ---> a.c argv[2] ---> b.c argv[3] ---> c.c
#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"); }
命令行: ./a.out a.c b.c c.c 输出: =============Begin argv============= ./a.out a.c b.c c.c =============End argv============= =============Begin env============= ORBIT_SOCKETDIR=/tmp/orbit-delphi SSH_AGENT_PID=1695 TERM=xterm SHELL=/bin/bash XDG_SESSION_COOKIE=6c560f89cd4609726ff940b800000007-1544093738.93069-2082860285 WINDOWID=71303204 ...... ...... =============End env=============
实例,gcc 命令行不一样参数,实现不一样功能
- 面试中的小问题,main 函数必定是程序执行的第一个函数吗?
不必定。
在 gcc 中使用属性关键字 attribute, 能够指定 main 以前与 main 以后分别执行一个函数。
但有的编译器没有支持相关功能关键字扩展,那么 main 函数是第一个运行的函数,例BCC。
#include <stdio.h> #ifndef __GNC__ #define __GNU__ #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
- 一个 C 程序是从 main 函数开始执行的
- main 函数是操做系统调用的函数
- main 函数有参数和返回值
- 现代编译器支持在 main 函数前调用其它函数
补充:不一样编译器有不一样的功能扩展,为了程序的能够执性,若是不是及其特殊状况,不编写依赖编译器的代码
以上内容参考狄泰软件学院系列课程,请你们保护原创!