当我们来到火星上,回头看我们居住的地球,很轻易地发现地球是圆的。
无论您是刚刚学习C语言,还是您已经使用了十年C语言。您肯定见过main函数的不同形式:
main函数的形式这么多,好像每一种都能编译通过,都能用于生成可执行文件。
就这么一个简单的main函数,很多使用C语言长达十年的程序员只知道有这么多形式,但不知道为什么。我个人认为,使用一样东西,而不知道其原理,总让人惴惴不安。
假如您一直在Windows环境下做C程序开发,有可能您这一辈子都弄不懂为什么main函数是这个样子。一旦您跳出Windows范围,学习UNIX、MINIX、Linux环境编程,您就会恍然大悟,就像人类从火星看地球一样,原来世界是这个样子!
UNIX从诞生的第一天起,就是一个多进程操作系统。
下面是进程的两个概念:
(1)当我们编写的程序启动后,就成为了一个进程;
(2)一个进程可以创建另一个进程,创建者为父进程,被创建者为子进程。
C语言是和UNIX紧密结合的,对我们程序员来说,main是入口函数,当main被执行时,就是创建了一个子进程。
从父进程和子进程通信的角度来看,main函数的作用是:
(1)父进程通过main函数的参数,向子进程传递信息;
(2)子进程通过main函数的返回值,向父进程返回信息:0表示正常,其他值表示错误。
所以,真正的main函数只有一种形式!!!
它就是:
其他的main函数形式呢?
其他的main函数形式,都只是C编译器送给您的语法糖!!!
语法糖的规则是:
(1)如果您编写的main函数不使用参数,C编译器会给您加上int argc, char** argv参数,只是您没有使用而已;
(2)如果您编写的main函数返回void,C编译器会帮您把void改为int,并且将main函数的所有return语句改为return 0,并在函数结尾加上return 0。