在 C++ 中解決控制達到終點的非虛擬函式錯誤

Jinku Hu 2023年10月12日
  1. 在函式體的結尾使用 return 語句
  2. 在函式體的每條程式碼路徑末尾使用 return 語句
在 C++ 中解決控制達到終點的非虛擬函式錯誤

本文將為大家講解解決控制到達終點的非 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
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Function