在 C++ 中解決控制達到終點的非虛擬函式錯誤
Jinku Hu
2023年10月12日
本文將為大家講解解決控制到達終點的非 void 函式錯誤 C++ 的幾種方法。
在函式體的結尾使用 return
語句
非 void 函式需要有一個返回型別。因此,函式需要有一個返回相應型別物件的語句。如果傳遞了某些編譯器標誌,這種型別的錯誤或警告可能會被完全抑制,如果給定的函式在程式中被呼叫,將導致執行時故障。
下面的示例程式碼中定義了 reverseString
函式,該函式接受一個字串的引用並返回字串值。如果我們研究一下函式體,並沒有 return
語句。即使 reverseString
沒有向呼叫函式傳遞任何引數,編譯器也只是顯示警告資訊,可執行程式還是會被構建。如果函式被呼叫,那麼控制流很可能會導致分段故障。
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::reverse;
using std::string;
string reverseString(string &s) { string rev(s.rbegin(), s.rend()); }
int main() {
string str = "This string is arbitrary";
int cond = -1;
cout << str << endl;
cout << reverseString(str, cond) << endl;
return EXIT_SUCCESS;
}
在函式體的每條程式碼路徑末尾使用 return
語句
另一種控制到達非 void 函式結尾的情況是,條件塊中並不是每條路徑都有 return
語句。因此,如果非 void 函式中的執行是分支的,而且 if
語句並沒有覆蓋每一條可能的路徑,那麼就需要在函式體的末尾有一個顯式的 return
呼叫。
下一個例子演示了字串操作函式的兩個條件路徑,將返回值傳遞給呼叫函式。然而,有些情況下,對於給定的條件沒有進行評估,這意味著控制流可能會到達函式塊的末端,並導致執行時錯誤。
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::reverse;
using std::string;
string reverseString(string &s, int condition) {
if (condition == -1) {
string rev(s.rbegin(), s.rend());
return s;
} else if (condition == 0) {
return s;
}
}
int main() {
string str = "This string is arbitrary";
int cond = -1;
cout << str << endl;
cout << reverseString(str, cond) << endl;
return EXIT_SUCCESS;
}
你可能會看到下面的警告。
Main.cpp:15:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.
作者: Jinku Hu