在 C++ 中解決控制達到終點的非虛擬函式錯誤
    
    Jinku Hu
    2023年10月12日
    
    C++
    C++ Function
    
 
本文將為大家講解解決控制到達終點的非 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.
        Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
    
作者: Jinku Hu
    
