| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3692 人关注过本帖
标题:这两种语句,C++什么标准?
只看楼主 加入收藏
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:0 
如果以是否返回值、或者返回什么值作为判断的唯一标准,有些牵强;

除了通过返回值来判断是否执行成功,那还有第二种方法吗?难道读取程序的输出?

强制返回0就不叫漏洞,不返回0就叫漏洞,一个函数的返回值有这么大功效?

你理解错了吧,正确的逻辑是 执行成功就应该返回0,执行失败就应该返回非零。
如果不给出正确的返回值,调用者就没法知道程序是否执行成功。

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

不可能的,除非你用的是C99之前的C标准。
在C99之前,没有规定会自动return 0;,那么不写return自然要给出警告。

在古老的C/C++标准中:
int main(void) 和 main(void) 等价;
main函数的任何退出分支必须显式写上 return xxx。

在当今的C/C++标准中:
main(void) 不再合法;
main函数的任何退出分支,若没有显式写上 return xxx,则隐式的 return 0;
2020-06-28 08:47
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 

操作系统:中标麒麟V7.0;    cpu:龙芯3A-2000;    gcc:4.9.3

图片附件: 游客没有浏览图片的权限,请 登录注册

梦想拥有一台龙芯3A-4000
2020-06-28 18:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:0 
回复 12楼 ditg
gcc4.9.3 默认使用的是 C90 标准(严格来说是gun89标准,差不多),你可以添加编译参数 -std=c99 让它用新一些的C标准。
gcc5 开始,默认用 C11 标准
gcc8 开始,默认用 C17 标准
最新的gcc发布版本是gcc10
gcc11也可以下载了,但不算稳定。
2020-06-28 19:18
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
HOSTCFLAGS    = -D__LIBRARY__ -Wall -Wstrict-prototypes -std=c99 -O2 -g -I.
HOSTCC        = gcc


考虑是编译器的问题?

梦想拥有一台龙芯3A-4000
2020-06-28 19:49
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
另外,我依然不认为void main非法;依然认为shell不会处理非0返回值(因为shell自己都在搞截断,0-255);依然认为除人为设计外,返回任何值都不算错误;依然认为警告并不等于错误。回到前面说的,绝不等于非法。

[此贴子已经被作者于2020-6-28 20:05编辑过]


梦想拥有一台龙芯3A-4000
2020-06-28 19:57
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 15楼 ditg
C标准没说非法 各个标准要求略有不用 但至少实现定义
C++中毫无疑问是非法
图片附件: 游客没有浏览图片的权限,请 登录注册

https://zh.
2020-06-28 20:15
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 15楼 ditg
C标准没说非法 各个标准要求略有不用 但至少实现定义
C++中毫无疑问是非法
图片附件: 游客没有浏览图片的权限,请 登录注册

https://zh.
2020-06-28 20:15
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 14楼 ditg
这是一个 程序调用者 编译器 标准 和 程序编写者 多方约定
标准 对其他三者宣称 宿主模式下的C程序的main函数会返回一个 int
标准编译器 按照标准的要求保证 int main 这样的main函数能被正确编译
程序调用者 按照调用C程序会得到一个int返回值这个模式处理C程序
现在到程序编写者 其他人都遵守约定了 就你这胡搞瞎搞 可能不出问题 但出问题就是你本身的责任

可以自己实现一个编译器(教学用 娱乐用 学习用 等等)
对于不是int main 这样的代码按照返回一个Error处理 这样做完全合理



https://zh.
2020-06-28 20:18
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
好像一直就没C++什么事,反正从我知道的时候就要求必须有返回值,说不准从第一天开始它就这么要求的(感觉本贾啥事都干得出来,呵呵)。

楼上有一句话我很欣赏,出问题就是你本身的责任;虽然自己实力不济,但喜欢这种态度。我喜欢简单,条条框框少一点,编程都玩得快乐些。说实话,虽然自己不会这么写,但找个话题聊聊天也算打发疫情时间,近期着实有点闷。

自己平时喜欢看点内核代码,但进展偏慢,遇到不会的再向几位神级人物讨教,先谢了!

梦想拥有一台龙芯3A-4000
2020-06-28 21:27
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:0 
回复 17楼 lin5161678
我用gcc4.9.3测试,
$ gcc prog.c -Wall -Wextra -std=c89 报 warning: return type of 'main' is not 'int' [-Wmain]
$ gcc prog.c -Wall -Wextra -std=c99 报 warning: return type of 'main' is not 'int' [-Wmain]
2020-06-28 21:52
快速回复:这两种语句,C++什么标准?
数据加载中...
 
   



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

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