免费注册 查看新帖 |

Chinaunix

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

[C] main函数返回值的作用,void和int的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-22 19:01 |只看该作者 |倒序浏览
程序要运行,首先要加载到内存中,是操作系统干了这个活,但是具体是操作系统的哪个程序或者进程干的呢?求解。
其次,关于main函数的返回值问题。首先说下我的经历。vc6.0中都编译通过,且程序运行也没有出什么错。用gcc编译的话,main函数的返回值是void,gcc会给出警告,但是程序貌似还是正常运行。但是在linux eclipse中,如果main的返回值是void,编译会通不过。
由此,引发了一个问题,main函数返回值有什么用?返回信息给这个程序的加载者还是操作系统?求大神解答。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
2 [报告]
发表于 2013-10-22 19:49 |只看该作者
通常main函数的返回值都会作为进程的退出返回值,如果是void那么退出返回值就是汇编代码上下文相关的一个未知数(是什么都有可能,但并不是每次变化的随机值);而这个退出返回值,其他程序都可以通过api来获取(如果需要的话),当然这个支持显然是操作系统做的桥梁。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
3 [报告]
发表于 2013-10-22 19:56 |只看该作者
还有一点需要特别说明,如果是学pascal出身的,由于pascal对“函数”和“过程”进行了区分,认为有返回值的是“函数”,没有返回值的是“过程”,而语法上对于“函数”又要求必须把返回值“利用”起来(赋值给谁,或者if消耗掉),否则不能通过编译。结果导致很多pascal出身的人,认为有返回值的东西,必须要有接收者,否则就是不符合逻辑的。但是实际上在最亲近指令执行上并非如此,返回值是否有接收者并不重要。我不知道LZ的疑惑是否也源于此,不过不管怎么说,LZ其实也不需要关心其返回值会被谁利用这个问题。

论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00
4 [报告]
发表于 2013-10-23 04:42 |只看该作者
本帖最后由 fly3ds 于 2013-10-23 04:43 编辑

main返回值,可以在shell环境下可以打印出来,'echo $?‘

cmd下应该也可以打印出来,没研究过。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2013-10-23 07:46 |只看该作者
回复 4# fly3ds


    cmd下是 %errorlevel%

论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00
6 [报告]
发表于 2013-10-23 07:50 |只看该作者
回复 5# folklore


试了下,确实如此。

论坛徽章:
0
7 [报告]
发表于 2013-10-23 08:52 |只看该作者

论坛徽章:
0
8 [报告]
发表于 2013-10-23 08:54 |只看该作者

论坛徽章:
0
9 [报告]
发表于 2013-10-23 10:38 |只看该作者
带有Linux内核字样的书都有这方面的解释,比较薄的那本好象叫  Linux内核设计与实现,开篇就讲了系统怎么启动进程,然后怎么控制。有兴趣的话可以看看这方面的书。

论坛徽章:
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
10 [报告]
发表于 2013-10-23 14:34 |只看该作者
回复 1# 511244213


    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最好严格按照标准来,否则代码不能保证可移植性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP