Fehler Control Reaches End of Non-Void Function in C++ beheben

  1. Verwenden Sie die Anweisung return am Ende des Funktionskörpers
  2. Verwenden Sie die return-Anweisungen am Ende jedes Codepfades des Funktionskörpers

In diesem Artikel werden mehrere Methoden zur Lösung des Fehlers control reaches end of non-void function in C++ erläutert.

Verwenden Sie die Anweisung return am Ende des Funktionskörpers

Nicht-voide Funktionen müssen einen Rückgabetyp haben. Folglich muss die Funktion eine Anweisung haben, die das Objekt des entsprechenden Typs zurückgibt. Wenn bestimmte Compiler-Flags übergeben werden, wird diese Art von Fehler oder Warnung möglicherweise ganz unterdrückt, was zu Laufzeitfehlern führt, wenn die angegebene Funktion im Programm aufgerufen wird.

Im folgenden Beispielcode ist die Funktion reverseString definiert, die eine Referenz auf eine Zeichenkette entgegennimmt und den String-Wert zurückgibt. Wenn wir einen Blick in den Funktionskörper werfen, gibt es keine return-Anweisung. Obwohl die Funktion reverseString keine Argumente an die aufrufende Funktion übergibt, zeigt der Compiler nur die Warnmeldung an, und das ausführbare Programm wird trotzdem erstellt. Wenn die Funktion aufgerufen wird, dann würde der Kontrollfluss höchstwahrscheinlich zu einem Segmentierungsfehler führen.

#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;
}

Verwenden Sie die return-Anweisungen am Ende jedes Codepfades des Funktionskörpers

Ein weiteres Szenario, bei dem die Kontrolle das Ende einer nicht-voiden Funktion erreicht, ist, wenn die bedingten Blöcke nicht in jedem Pfad die return-Anweisungen enthalten. Wenn also die Ausführung in der Non-Void-Funktion verzweigt ist und die if-Anweisungen nicht jeden möglichen Pfad abdecken, muss es einen expliziten return-Aufruf am Ende des Funktionskörpers geben.

Das nächste Beispiel demonstriert die Funktion zur Zeichenkettenmanipulation mit zwei bedingten Pfaden, die den Rückgabewert an die aufrufende Funktion übergeben. Allerdings werden einige Fälle für die gegebene Bedingung nicht ausgewertet, was bedeutet, dass der Kontrollfluss möglicherweise das Ende des Funktionsblocks erreicht und Laufzeitfehler verursacht.

#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;
}

Möglicherweise wird die folgende Warnung angezeigt.

Main.cpp:15:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.

Verwandter Artikel - C++ Function

  • So geben Sie ein Array von einer Funktion in C++ zurück
  • Callback-Funktionen in C++ Verwenden