![](/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.