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

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

本文將為大家講解解決控制到達終點的非 void 函式錯誤 C++ 的幾種方法。

在函式體的結尾使用 return 語句

非 void 函式需要有一個返回型別。因此,函式需要有一個返回相應型別物件的語句。如果傳遞了某些編譯器標誌,這種型別的錯誤或警告可能會被完全抑制,如果給定的函式在程式中被呼叫,將導致執行時故障。

下面的示例程式碼中定義了 reverseString 函式,該函式接受一個字串的引用並返回字串值。如果我們研究一下函式體,並沒有 return 語句。即使 reverseString 沒有向呼叫函式傳遞任何引數,編譯器也只是顯示警告資訊,可執行程式還是會被構建。如果函式被呼叫,那麼控制流很可能會導致分段故障。

#include <iostream>
#include <algorithm>
#include <iterator>

using std::cout; using std::endl;
using std::string; using std::reverse;

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 <iostream>
#include <algorithm>
#include <iterator>

using std::cout; using std::endl;
using std::string; using std::reverse;

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.
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Function