【编程基础】main函数,你知道多少?

近期学习时对这个问题产生了迷惑,看到了这篇文章,感觉挺好。

在C/C++的学习过程中,一个很常见的问题就是void main和int main有什么区别呢?本文试图回答该问题,并涉及一些相关问题,包括一些main函数的其他实现。

首要说明的一点是这些(主题)可能是人们看起来会为之争辩几小时甚至好几天的问题。有些论据是有根据的,有些不是,而有些只是普通而过时的观点。C标准和C++标准在main函数上是有区别的,所以将分别详细来介绍他们。

一、对于C语言:

C89标准的main()函数是可接受的,尽管现在建议是使用C99的标准。C99标准只定义了如下两种可接受的函数原型:

int main ( void )

int main ( int argc, char *argv[] )

以上函数原型微小的变形也是可以被接受的,比如int可以被typedef定义为int的名字所代替,argv的类型也可以写成char **argv,等等。

第一种函数原型选择适用你不需要访问命令行参数的情况。

对于第二种函数原型选择,如果你喜欢的话,标识符argc和argv的名字可以改变,但是坚持使用argc/argv是一个惯例。

main()函数的返回值必须是一个int型,返回值给main()函数的调用者传递一个int类型的状态。

在C89标准下,main()函数中的return语句是必须的;然而在C99标准下,如果没有写return语句,默认(隐含的)会return 0。

二、对于C++语言:

可以被接受的使用方式有:

int main ( int argc, char *argv[] )

int main ()

第一种遵循被C99中使用的惯例。

第二种适用于不需要访问命令行参数的环境,相当于C99中的int main(void)。

return必须返回一个int型数值,默认返回0(但是标准中并没有要求)。

int main()和int main(void)的区别

C程序员通常误认为下面的函数原型是不要参数的:

int foo();

事实上,这个函数是被认为需要不确定个数的参数。告诉编译器函数为不带参数的正确做法是:在括号中使用void 关键字。

void main()的细节(机理):

C和C++中正常的函数调用和返回,假如你不想从一个函数中返回任何东西,你可以定义函数的返回值类型为void。例如,一个函数不带参数,无返回值的函数原型可以定义为:

void foo(void);

一个正常的误解是这样的逻辑也被应用于main函数。是的,它不可以,main函数是特殊的,你应该遵循标准并定义函数的返回值为int。但是在一些特殊的系统中是可以的。如果你不确定你正在使用的是否是特殊系统之一的话,那答案就是“不是”。如果是特殊系统的话,你应该已经知道了。

提醒你如果你在论坛上发带有"void main"的代码,会有人来告诉你要你纠正它。如果你回复说“我的老师说这样是可以的”也无用。老师们有错误的习惯。安全起见,在论坛上只贴标准的代码,然后你会发现人们集中在回答你的问题,而不是在告诉你函数原型的事情上浪费时间。

但是int main(int argc, char *argv[], char *envp[])是怎么回事呢?

作为对标准的扩展,在一些系统中一个附加的main函数参数可以被用来获得并访问环境变量。这并不保证在所有的编译器上都能正常工作,如果你想让你的代码可移植,那么请慎重使用它。

最后,为什么void main函数是不好的用法请参考

http://users.aber.ac.uk/auj/voidmain.cgi

本文摘自freeloki的blog

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏灯塔大数据

每周学点大数据 | No.8基础数据结构之线性表

No.8期 基础数据结构之线性表 Mr. 王:为了以后的知识描述方便,这里简单介绍一下数据结构的概念。数据结构是一个广泛存在于计算机科学中的概念。曾经有一位计...

36111
来自专栏Java呓语

工厂方法模式(延迟到子类来选择实现)

1、工厂方法模式理念介绍 2、它与简单方法模式的区别 3、推荐使用工厂方法的场景 4、在Android 源码中的应用

774
来自专栏向治洪

Scala入门笔记

Scala入门 Scala简介 ps:在最新的薪资调查中,Scala程序员的工资是平均最高的Scala工资。 Scala是一门多范式的编程语言,一种类似ja...

2147
来自专栏Phoenix的Android之旅

重构 - 完全不用 if-else 可能吗?

上次那篇重构-为什么 if-else 不是好代码 说到代码中的 if-else会随着代码量的增加,在迭代的过程中变的越来越难以维护, 然后用工厂模式的思路可以把...

852
来自专栏AzMark

Python列表与元组

1353
来自专栏斑斓

当函数成为一等公民时,设计模式的变化

GOF提出的设计模式,其本质思想是封装变化。故而,创建型模式封装的是对象创建的变化,结构型模式封装的是对象之间的协作与组合结构,行为型模式则封装了对象行为的变化...

3105
来自专栏大史住在大前端

javascript基础修炼(2)——What's this(上)

this是javascript关键字之一,是javascript能够实现面向对象编程的核心概念。用得好能让代码优雅高端,风骚飘逸,用不好也绝对是坑人坑己利器。我...

851
来自专栏web前端教室

js数据结构与算法--散列

不扯淡了,还是来学技术吧。 散列,是一种常用的数据存储技术,优势在于可以快速的插入或取出,使用它的数据结构,叫散列表。 它的优势哈,插入、删除、取用数据都很快,...

21310
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列1

Java面试系列1 1 静态变量和实例变量的区别? 静态变量也称作类变量,由static修饰,如:static int s; s就是静态变量,它只能通过类来访...

2785
来自专栏怀英的自我修炼

Java漫谈8

今天我们来聊聊字符串。 字符串,在Java中一个最接近与8大数据类型的存在。甚至于由于它太好用了,以至于在编写代码的时候都快忘了有个叫char的基本数据类型了。...

35610

扫码关注云+社区

领取腾讯云代金券