| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3476 人关注过本帖
标题:这两种语句,C++什么标准?
只看楼主 加入收藏
yuma
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:银河系
等 级:贵宾
威 望:37
帖 子:1926
专家分:2992
注 册:2009-12-22
结帖率:89.13%
收藏
已结贴  问题点数:20 回复次数:29 
这两种语句,C++什么标准?
程序代码:
void main()
{
......
return;
}




int main(void)
{
.....
}


这两种C++标准相同吗?
搜索更多相关主题的帖子: void C++ 语句 标准 main 
2020-06-11 07:18
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:14 
第一段代码,从古至今,乃至于未来,在C/C++中都是错误的。

main 的返回值用于表明执行是否成功,这是一个约定的规定,如果用void,那调用者就会收到一个不确定的垃圾值,但调用者不知道这个值没意义呀,会根据这个值行事。
假如有个函数foo,大家规定好执行成功返回true,执行失败返回false。那么调用者就可以这么写:
if( foo(……) )
    执行下一步
else
    显示错误,中断流程。
但某个实现foo的傻逼没按规定返回指定值,那么上面的代码就乱套了。

假如要允许 void main 的话,那必然就得增加一个新的接口,告诉调用者main没有返回有意义的值。这不是简单的“脱裤子放屁”呀,这是“蛆虫为了吃口新鲜的屎,特意养了一个大活人”呀!
2020-06-11 08:37
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
完全错误倒也谈不上,起码有一点linux内核主函数直到今天依然在用void start_kernel(void),早期一直用main后来改了个名成现在的start_kernel,如果内核都在使用,为啥应用程序就不能使用了?

丹尼斯里奇(C的发明者)的书里连void都懒得写,直接就是main,我认为他知道应用程序其实就是一个子进程,如果要观察返回值,内核执行的加载执行程序exec函数每一步的返回值更重要或更有意义。

至于现在有的编译器不支持void,估计也就是后来这样明确写返回0的神级人物多了,约定成俗而已(个人观点)

[此贴子已经被作者于2020-6-26 21:09编辑过]


梦想拥有一台龙芯3A-4000
2020-06-26 21:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
丹尼斯里奇(C的发明者)的书里连void都懒得写,直接就是main

因为K&D时代,C99之前,main函数省略返回类型,默认就是int。
那时候函数声明 foo(……)
就完全等同于函数声明 int foo(……)
2020-06-26 21:18
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
是滴,默认int,累加器里置0,现在有什么不一样吗?

比如,印象里您经常写int的时候省略返回值语句;换句话说,如果能够编译成功,相当于编译器一定遵从某个标准(具体我不知道)也会照常添加相应的置0语句,不管写还是不写return 0;

另外,就算最后返回的不是0值我觉得也没啥,也不代表程序就错了,不返回0值shell也不做任何处理,因为“程序执行完了”

[此贴子已经被作者于2020-6-26 21:53编辑过]


梦想拥有一台龙芯3A-4000
2020-06-26 21:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
是滴,默认int,累加器里置0,现在有什么不一样吗?

之前没有“累加器里置0”这一规定,所以void main给调用者的就是一个不确定的数。

印象里您经常写int的时候省略返回值语句;

因为c99规定main的退出分支若无return语句则默认return 0。
而void main至始至终都是不合法的,标准从来规定要为一个不合法的函数去做什么。

另外,就算最后返回的不是0值我觉得也没啥,也不代表程序就错了,不返回0值shell也不做任何处理,因为“程序执行完了”

不代表程序错了,但你不知道它是不是错了。
比如你把数据保存到磁盘,没执行成功就要排除错误继续尝试保存,而不是不管不顾走人了。
比如你下载文件再处理,“下载文件”是个单独的程序,你执行了“下载文件”但不知道有没有成功,那你继续执行“处理”吗?
2020-06-27 10:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
说个题外话,
在BIOS中,以前的legacy代码都是顶层执行者,没有调用者,很多人写 void main 或者 int main但无return。
efi提出时,为了复用旧程序,我就被安排检测各个编译器是否在不规范写法的情况下能return 0。
当时收集了IBM、Intel、amd、Phoenix、ami、ms等等所有联盟成员的所有编译器进行测试,测试结果是都不行。
2020-06-27 10:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
一切 void main 能编译通过的编译器,不是因为编译器允许 void main,而是因为编译器没有堵上 void main 这个漏洞。
因此编译器也就不对针对 void main 进行防范(例如自动return 0;)

比如以前的绿皮火车,乘客可以跳窗自杀,并不是铁路管理局允许乘客跳窗自杀,而是铁路管理局没有堵上跳窗自杀这个漏洞。
既然懒得去堵上跳窗自杀这个漏洞,自动就不会在铁路两旁铺上软垫让跳窗者摔不死。

现在的高铁,直接就将窗户封死,堵上了这个漏洞,那自然就更不会在铁路两旁铺上软垫了。

我的意思是,懒的编译器,懒得封堵漏洞,自然更懒得为漏洞搽屁股;好的编译器,没有漏洞,自然不会吐裤子放屁为没有的东西作防范。
2020-06-27 11:48
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
[b]
比如你把数据保存到磁盘,没执行成功就要排除错误继续尝试保存,而不是不管不顾走人了。
比如你下载文件再处理,“下载文件”是个单独的程序,你执行了“下载文件”但不知道有没有成功,那你继续执行“处理”吗?


程序执行过程中,跟main函数执行到最后的返回值没有任何关系。如果必须以main函数中的某一个动作为例,比如读盘写盘过程,那早期内核在处理时会把进程挂起直到中断结束(下载文件过程类似)。

梦想拥有一台龙芯3A-4000
2020-06-27 18:57
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
一切 void main 能编译通过的编译器,不是因为编译器允许 void main,而是因为编译器没有堵上 void main 这个漏洞。


如果以是否返回值、或者返回什么值作为判断的唯一标准,有些牵强;强制返回0就不叫漏洞,不返回0就叫漏洞,一个函数的返回值有这么大功效?

我不知道有些现象怎么解释,比如gcc和g++,int main(void)时,没有return 0时gcc出警告(-Wall情况下),但g++表示正常;是否表明C编译器和c++编译器长期以来一直执行着不一样的标准,即使出现问题也不能一概而论?


闲话:您翻一下里奇(C)和本贾(C++)的本人照片对比,不是八卦,面相上是不是可以看出一些编程思想上的差异?

梦想拥有一台龙芯3A-4000
2020-06-27 19:09
快速回复:这两种语句,C++什么标准?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016259 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved