![](/img/trans.png)
[英]How to fix "error: control reaches end of non-void function [-Werror=return-type]" at HackerRank?
[英]How to fix "error: control reaches end of non-void function"?
你的编译器没有你那么聪明。 您可能很清楚,函数永远不会在n
小于 1 时被调用,但编译器不会。 我个人认为对于典型的输入,它被称为n
为0
。
因此,它认为程序控制可以在没有显式返回的情况下到达函数右大括号}
,如果您使用函数返回值,那么在形式上是未定义的行为,重复一遍,我认为您这样做了。
您收到此警告,编译器向您发出的警告提升为错误,因此编译停止。
一些修复:
用更强的if (n <= 1){
阻止递归。
使用assert(false)
或类似方法在右大括号}
之前运行时断言。
关闭将该警告提升为错误,但仍要处理该警告。
来自@JonathanLeffler 的一些建议
不要关闭 -Werror - 它太有价值了。 处理警告。 断言(n >= 0); 在顶部; 如果 (n <= 1) { 返回 1; 以及。 断言在调试版本中触发; 即使没有启用断言,错误的参数值也可以合理安全和理智地处理。
除了这里的其他答案之外,还有一个很好的技巧。
如果你绝对确定你知道的比编译器多,而且没有什么可返回的,那么放一个abort();
作为函数的最后一行。 编译器足够聪明,知道abort()
永远不会返回,因为它会导致程序崩溃。 这将使警告静音。
请注意,程序崩溃是一件好事。 因为在这种情况下,当“不可能的事情”确实发生时,您会崩溃,并且如果您正在使用调试器,它将在您的调试器中弹出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.