为什么不报错?

treeroot 2006-03-13 01:19:16
我声明没有返回值的方法返回一个值竟然都可以,声明有返回值的也可以没有return语句
都只是一些警告而已,竟然可以编译运行,怎么回事,难道是编译器的问题(VC6.0)
void f1(){
return 1;
}
...全文
181 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
anguofeng 2006-03-13
  • 打赏
  • 举报
回复
好像在6.0里的确是不报错
但是在gcc里会报错的
c++因为有函数重载的问题所以对函数的返回值和参数检查会特别严格
jixingzhong 2006-03-13
  • 打赏
  • 举报
回复
有警告就差不多了 ...

不过,C++相比于C还是有很多这方面的限制的 ...
cenlmmx 2006-03-13
  • 打赏
  • 举报
回复
..
goodluckyxl 2006-03-13
  • 打赏
  • 举报
回复
这个返回的问题告警和报error只要报信息就不关编译器的好坏
如果说完全没有反应的那可以定义为烂编译器
原因是这样的:
就那楼主的例子, 无返回值,在函数调用中R0-R7作为通用寄存器
会当作变量返回的地址区
你return 1 最坏的情况 编译器往r0写了数据作为返回值
但是当真正调用完毕后因为根据实际函数返回时检测出无参数类型
就不需要把R0当作参数返回
同理在有返回时没有return,最终会选择r0返回时 最坏情况里面的值非理想值而已
而编译器已经尽到责任
liweiswin 2006-03-13
  • 打赏
  • 举报
回复
警告 noname.c 5: void类型的函数不应有返回值在 f1 函数中
这是我在WINtc下编译的警告
ykzhujiang 2006-03-13
  • 打赏
  • 举报
回复
在C语言中这样做是可以的,但是在C++里面是不行的。
这是因为C语言中对于函数签名没有将参数包括在内,当该函数所在的编译单元被编译后,将会生成一个函数,名字类似_f1,对于其参数是不表示在其中的。这也是C语言中一个比较重要的问题,因为他导致了不安全性。并且在C语言中对于外部函数的检查比较松,比如一个函数void f(int),在另外一个文件中可以按照void f(float)等等的方法进行调用而不会报错,这样虽然编译可以通过,但是实际上是有问题的,会造成很难发现的错误。
然而在C++中,函数的签名包括了参数,这样前面的两个函数就会被编译成_f_int和_f_float的形式,这样程序就会有一个link错误,因为他们的函数签名时不一样的。
iamcaicainiao 2006-03-13
  • 打赏
  • 举报
回复
应该就是编译器的问题。 vc6.0真的很烂。
ouyh12345 2006-03-13
  • 打赏
  • 举报
回复
在偶的编译器(VC6SP6)里,有返回值的不返回则有错误

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧