探寻main函数的标准写法,以及获取main函数的参数、返回值

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
编程

main函数表示法

        不少同窗在初学C或者C++时,都见过各类各样的main函数表示法:数组

  • main(){/*...*/}
  • void main(){/*...*/}
  • int main(){/*...*/}
  • int main(void){/*...*/}
  • int main(int argc, char *argv[]){/*...*/}
  • int main(int argc, char **argv){/*...*/}
  • ......

        看过这么多写法以后,不由顿生疑惑,到底哪一个才是main函数的标准写法?函数


main函数的标准写法

        先看C语言标准文档里对main函数的描述:spa


        再看C++标准文档里对main函数的描述:指针


        至此,哪些是标准写法便一目了然。blog

        那么写成main()或者void main()到底行不行?答案是不必定行。在旧的编译器上,这样写也能经过,但主要是为了兼容C/C++标准未出来以前的历史代码。在较新的编译器上,这样写都会获得一个警告信息,或者,干脆就是错误信息,没法经过编译。递归

        因此,为了代码的规范性,通用性,请坚持按标准文档里推荐的写法来写。尤为是初学者,按标准来写是一种很好的习惯,而编程重的好习惯甚至比编程自己还重要!文档

        那么也有人疑惑main函数第二个参数究竟是char *argv[]仍是char **argv?答案是都行,argv首先是一个数组,其数组元素的类型是字符指针,每个字符指针都指向一个特定的字符串,以下图:字符串


        此外,也许还有人对main函数的参数名称有疑问,既然main函数也是个函数,那么它的参数名称argc、argv能够替换成其它合法的标识符吗?这个答案也是确定的,若是心血来潮,写成int main(int a, char *b[])这种形式也是被容许的,可是仍然建议按argc、argv写,避免没必要要的疑惑。cmd


main函数为何要有返回值和参数值

        简单地说,为了与系统环境通讯。

        main函数是系统执行程序的入口,能够将main函数看作是供系统调用的。既然系统能够调用main函数,那么系统就有为main函数传递指令(参数)的需求,同时,main函数也有为系统环境返回信号的义务。这样一来,参数充当入口,return充当出口,使得main函数的功能更加完善。


获取main函数的参数值

        既然main函数能够有参数,那么就必定能够获取它的参数值,只要为它传入指定的实参,就能够在main函数中把它打印出来。

        先写一段打印参数的代码,命名为text.c,编译,默认结果显示argv[0]存储函数名称及其路径,而argv[argc]为空指针:


        打开cmd命令窗口,切换至程序所在目录,为本程序传入参数:


        显然,打印出的参数内容与咱们的预期一致。


获取main函数的返回值

        同理,main函数既然为系统返回了信号,那么系统也必定能够获取到它。重写编写源文件,此次咱们把无关部分所有略去,只剩返回值。

        先编译,而后打开cmd窗口切换至当前程序目录下,输入text.exe,回车后,再输入echo %errorlevel%,而后就能够看到打印出的返回值了:


        除了这种方法,也能够用main函数调用main函数自己来打印它的返回值,可是这样作就至关于让main函数进入了递归调用当中,必须设定恰当的终止条件,不然程序将陷入无限递归,进而崩溃。



小结

        由此能够看出,main函数除了能够与系统通讯外,与普通函数仍是很一致的,说到底,它也只是个函数么。

        编程中,一些语法是标准所强制要求的,另外一些语法标准里并未强制要求,而是建议,或者连建议都没,只是由编译器的实现而定。这时候,就要尽可能按标准里强制的或者建议的语法去书写程序,这样作能够极大地保证程序的健壮性。


▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲