免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4595 | 回复: 6
打印 上一主题 下一主题

[C++] [结贴]C/C++的标准,有没有规定main函数必须返回一个整数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-14 11:01 |只看该作者 |倒序浏览
本帖最后由 sampher 于 2013-11-21 08:59 编辑

下面这样的代码把main声明为void返回类型,在VC下是能编译通过的,在GCC下编译会提示main必须有返回值。

  1. void main(...){
  2. ...
  3. }
复制代码
我想知道C/C++标准对此有规定吗? 还是不同时期,不同版本的C/C++标准,对此的规定都不同? 抑或是编译器厂商自己决定的,main()的形式不在标准之内?
5L版主给的回复应该是最佳答案!
----------------------------------------------------------------------------------
main函数的返回值就是运行其程序的这个进程的状态码,命令行程序常常通过判断相应命令(进程)的状态码来判断相应命令是结果是否正常,VC++是允许void main这种形式的程序入口原型的,之所以允许这么做是有历史原因的,在最初的K&R C中main函数的原型为:main(),没有对返回值和参数做出明确规定,为此存在不同main函数原型扩展。K&R C第二版开始对此做出了更细致的规定,除了main()这样的原型以外又加入了带参数的原型:main(int argc, char *argv[]),又由于K&R C中允许Implicit declarations(未经声明而直接使用的将视为int类型,函数返回值也视为int)。main函数原型真正的定型是从C89(第一版ANSI C标准)开始的,此标准明确了int main(void)和int main(int argc, char *argv[])这两个原型,其它的原型是不允许的,考虑到对旧代码的兼容问题,许多编译器也允许K&R C中的原型,不带返回值类型的main视为void或int处理(由编译器决定)。从此以后main逐渐的定型下来,但部分编译器依然存在不同的扩展,比如说带有环境变量参数envp的扩展。总而言之,使用main最好严格按照标准来,否则代码不能保证可移植性。


总之:标准C/C++都对返回值有要求,没标准化之前的没要求,很多编译器为了兼容老代码才允许了返回值原型为void的形式。

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
2 [报告]
发表于 2013-11-14 16:35 |只看该作者
这个代码 我gcc能编过并正常运行。

论坛徽章:
11
巨蟹座
日期:2013-12-23 11:12:14双子座
日期:2014-08-28 09:14:55子鼠
日期:2014-07-25 16:21:22摩羯座
日期:2014-07-23 15:17:47摩羯座
日期:2014-05-30 13:09:05午马
日期:2014-04-30 18:10:00天秤座
日期:2014-04-25 12:12:00申猴
日期:2014-04-22 11:30:15午马
日期:2014-03-07 16:06:40辰龙
日期:2013-12-25 18:36:00摩羯座
日期:2014-09-02 17:00:55
3 [报告]
发表于 2013-11-14 16:48 |只看该作者
时期不同,标准不同 -> 编译器版本不同所依据的标准不同

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
4 [报告]
发表于 2013-11-14 19:45 |只看该作者
main 中的return值,最终会被传递给exit函数,然后在传递给_exit函数,这个return值会作为系统取得进程退出的返回码。 $> echo $?  --凭印象说的。但是返回void肯定不对(切确的说是不合标准)。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
5 [报告]
发表于 2013-11-14 19:50 |只看该作者
回复 1# sampher


    main函数的返回值就是运行其程序的这个进程的状态码,命令行程序常常通过判断相应命令(进程)的状态码来判断相应命令是结果是否正常,VC++是允许void main这种形式的程序入口原型的,之所以允许这么做是有历史原因的,在最初的K&R C中main函数的原型为:main(),没有对返回值和参数做出明确规定,为此存在不同main函数原型扩展。K&R C第二版开始对此做出了更细致的规定,除了main()这样的原型以外又加入了带参数的原型:main(int argc, char *argv[]),又由于K&R C中允许Implicit declarations(未经声明而直接使用的将视为int类型,函数返回值也视为int)。main函数原型真正的定型是从C89(第一版ANSI C标准)开始的,此标准明确了int main(void)和int main(int argc, char *argv[])这两个原型,其它的原型是不允许的,考虑到对旧代码的兼容问题,许多编译器也允许K&R C中的原型,不带返回值类型的main视为void或int处理(由编译器决定)。从此以后main逐渐的定型下来,但部分编译器依然存在不同的扩展,比如说带有环境变量参数envp的扩展。总而言之,使用main最好严格按照标准来,否则代码不能保证可移植性。


 总之:标准C/C++都对返回值有要求,没标准化之前的没要求,很多编译器为了兼容老代码才允许了返回值原型为void的形式。

论坛徽章:
0
6 [报告]
发表于 2013-11-15 16:09 |只看该作者
应该是和编译器有关系

论坛徽章:
0
7 [报告]
发表于 2013-11-16 12:30 |只看该作者
上学时:
void main() {
   
}

现在:
int main(int argc, char*argv[]) {
    return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP